Утечка памяти в .Net - PullRequest
5 голосов
/ 24 мая 2011

Я хочу знать, действительно ли просачивается память. Мой сценарий похож на

  1. Мое приложение .Net занимает х памяти.
  2. Я открыл несколько диалогов, и теперь это занимает х + у количество памяти
  3. Закрыты все недавно открытые диалоги
  4. до сих пор память около x + Y

Это утечка памяти или может быть ситуация, когда сборщик мусора не очистил память.

А так же события считаются ссылками. Что если событие присутствует в разыменованном объекте? тогда это событие не будет рассматриваться как ссылка, верно?

Ответы [ 5 ]

10 голосов
/ 24 мая 2011

Сборщик мусора освобождает только те объекты, на которые больше нет ссылок.

Он волшебным образом не удаляет все объекты, которые вам больше не нужны.

Проверьте, есть ли у вас ссылкик любому из объектов.Помните, что события также считаются ссылками.(Нужно знать, к какому объекту идти)

2 голосов
/ 24 мая 2011

Память используется только для сбора мусора, когда это необходимо, более технически, когда так называемое Поколение 0 заполнено или когда общее давление системной памяти достаточно для принудительного сбора мусора.Память не автоматически восстанавливается, когда выходит из области видимости.Подробнее здесь и здесь .

Только для тестирования, попробуйте вызвать GC.Collect() после закрытия диалога (после того, как на него больше нет ссылок), чтобы заставить ГХ собирать любую доступную память.

На самом деле вы должны не возиться с сборщиком мусора, он сильно настроен для лучшей производительности.

Если вы подозреваете, что у вас действительно происходит утечка памяти, используйте некоторыесвоего рода профилировщик памяти для анализа вашего приложения.

Попробуйте, например, RedGates Memory Profiler , у них есть пробная версия на основе времени.
Выполните этот обход чтобы набрать скорость и немного узнать, что искать и как.

1 голос
/ 24 мая 2011

В .Net, если вы не ссылаетесь на объект, объект возвращается обратно. Если у вас есть живая ссылка, то объект остается живым. Таким образом, чтобы найти утечку памяти, вам нужно сделать следующее

  1. Найти список объектов и занимаемой памяти
  2. Определите объекты, которые, по вашему мнению, должны были быть освобождены к настоящему времени.
  3. Найдите корень, в котором находится этот объект.
  4. исправить рут.

Вы можете сделать это с помощью некоторого профилировщика памяти или использовать WinDbg + sos. Люди чувствуют, что windbg сложно использовать, но в этих случаях windbg + sos намного проще в использовании и бесплатен Также вы будете чувствовать себя счастливым после устранения утечки. Вы будете одним из тех, кто всегда предпочитает бесплатные мощные инструменты.

Посмотрите на эту ссылку.

http://blogs.msdn.com/b/ricom/archive/2004/12/10/279612.aspx

http://blogs.msdn.com/b/delay/archive/2009/03/11/where-s-your-leak-at-using-windbg-sos-and-gcroot-to-diagnose-a-net-memory-leak.aspx

0 голосов
/ 24 мая 2011

Может быть ситуация, когда сборщик мусора не очистил память

0 голосов
/ 24 мая 2011

Как насчет использования инструмента профилирования памяти, такого как JetBrains dotTrace для профилирования использования памяти вашим приложением?

...