Задать вопрос

Как установить утечку памяти (timer — компонент панели элементов)?

Всем привет! Пишу программу, в ней использую стандартный компонент - timer. Решил посмотреть, как тратятся ресурсы на мою прогу. Оказалось, что с определенным интервалом времени программа поедает все больше и больше памяти. Создал новый проект, чтобы проверить, какой именно компонент ест память. Оказалось, это timer. Вот та строка, в которой выделяется память:
this.timer1.Tick += new System.EventHandler(this.timer1_Tick);

Допустим, значение таймера - 1 секунда. При первом запуске выделилось n-байт памяти, при втором тоже выделилось n-байт памяти, но про первые n-байт выделенной памяти наша программа забывает, и память утекает.
Как сделать, чтобы не было такой утечки памяти?
  • Вопрос задан
  • 2814 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
Kerman
@Kerman
Утечка памяти действительно может происходить, если эта строчка запускается каждую секунду. Строчка добавляет обработчик к событию и должна быть запущена только однажды, при инициализации.

Возможно, утечки нет, просто Вы не дождались срабатывания сборщика мусора. Я посоветую поставить таймер на 10мс и понаблюдать за динамикой расхода памяти. Дело в том, что действительно нужно выделить немного памяти на каждое срабатывание таймера, но собирать мусор после каждого срабатывания нерационально.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Что происходит внутри timer1_Tick()?
Ответ написан
@RPG
Даже в языке со сборщиком мусора можно устроить "утечку" памяти. Но формально, утечкой это не является - всю память рано или поздно очистит сборщик мусора, единственный негативный эффект - потеря производительности из-за частых вызовов сборщика мусора.

Избавиться от такого эффекта просто: нужно переписать код так, чтобы операция создания нового объекта происходила где-нибудь вне цикла. Это не всегда возможно, тогда нужно просто уменьшить частоту создания объектов, чтобы увеличить их время жизни (1 объект в секунду - не так страшно). Теоретически можно ещё задействовать повторное использование объекта. Это абстрактный совет и касается любого языка со сборщиком мусора.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы