Что вызывает утечку памяти в моем C # .NET в бездействующем приложении? - PullRequest
3 голосов
/ 13 февраля 2010

Я пытаюсь решить некоторые проблемы утечки памяти в приложении, и я действительно надеюсь, что кто-то здесь может предложить мне некоторые идеи, которые помогут. Я возился с этим весь день и боюсь, что застрял полностью.

Приложение, которое я устраняю, изначально работает нормально, но оно становится вялым и, возможно, даже зависает, если оно используется после простоя в течение пары часов. Я предполагаю, что это происходит из-за некоторой утечки памяти, которая усугубляется со временем. Насколько я знаю, нет внутренних процессов, таких как таймеры или бесконечные циклы и т. Д., Которые могли бы объяснить утечку памяти, но симптомы воспроизводимы, поэтому что-то определенно происходит.

Чтобы попытаться это решить, я скачал и установил пробную версию .NET Memory Profiler. К сожалению, я не совсем уверен, как интерпретировать полученные результаты. Насколько я могу судить, классы, которые мне кажутся наиболее проблемными, - это системные классы, такие как System.Version и System.Object []. Я думаю, что это основано на предположении, что «данные для поиска» - это число недоступных экземпляров и байтов, сообщенных профилировщиком.

Вот несколько примеров данных, похожих на то, что я видел:

  1. Пространство имен: система
    • Имя класса: версия
    • Живые экземпляры ...
    • Итого: 2
    • Дельта: 0
    • Live Bytes ...
    • Итого: 48
    • Новое: 48
    • Макс .: 24
    • Дельта: 0
    • недостижим ...
    • Экземпляры: 15,556
    • Байт: 373 344
  2. Пространство имен: система
    • Имя класса: Object []
    • Живые экземпляры ...
    • Всего: 1198
    • Дельта: 0
    • Live Bytes ...
    • Итого: 117 916
    • Новый: 117 916
    • Макс .: 7,016
    • Дельта: 0
    • недостижим ...
    • Экземпляры: 3054
    • Байт: 204 592

Если я читаю это право, две самые большие проблемы, с которыми я сталкиваюсь, это то, что у меня есть более 15 000 экземпляров версий сборок и более 3000 объектов, которые «недоступны», хотя по общему признанию, я не совсем уверен, что имеется в виду под « недостижим ".

Итак, мои конкретные вопросы:

  • Может кто-нибудь сказать, правильно ли я читаю данные .Net Memory Profiler?
  • Если я правильно читаю данные, что может заставить мое приложение генерировать больше экземпляров версий сборки и больше экземпляров объектов, пока конечный пользователь не взаимодействует с ними?

1 Ответ

5 голосов
/ 13 февраля 2010

Нет реальных доказательств какой-либо утечки из того, что вы опубликовали. Сборщик мусора некоторое время не запускался, это нормально для неактивной программы. 0.5 МБ, которые берут эти несобранные объекты, - это арахис.

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

Вы должны быть в состоянии различить индикатор доступа к жесткому диску, он должен был яростно мигать. Вы также можете узнать из TaskMgr.exe, вкладка «Процесс». Вид + Выбрать столбцы, отметьте Page Fault Delta. Это число должно стремиться к нулю в секунду или меньше после восстановления окна программы.

Дефрагментация вашего диска. Особенно файл подкачки, который сложно сделать. Задавайте вопросы об этом на superuser.com

...