Использование памяти приложением.NET - высокая неиспользуемая память.NET и неуправляемая память и фрагментация
Я использую профилировщик памяти ANTS для диагностики увеличения утечки памяти, с которой я сталкиваюсь в одном из моих приложений.NET 2.0. Я сделал 7 снимков процесса за 7,5 часов, и вот табличное представление полученных данных:
G1 представляет размер поколения 1 и размер поколения 2. За исключением неуправляемого пространства и личных байтов, все остальные значения указаны в МБ.
Мои вопросы -
Почему так много неиспользуемого пространства.NET, даже когда размеры кучи невелики?
Моя куча больших объектов занимает максимум около 2 МБ, а за последние 3 снимка остается 96 КБ. Тогда почему такие большие большие фрагменты, и они ответственны за большое неиспользуемое пространство?
Неуправляемое пространство постоянно увеличивается. Отвечает ли это за увеличение частных байтов с течением времени?
Я в своем уме, чтобы решить эту проблему, и провел несколько анализов, но не могу найти правильное решение для этого. Я готов предоставить любые другие необходимые данные.
1 ответ
Как уже указывал Алекс, здесь можно найти очень хорошее объяснение фрагментации кучи больших объектов:
https://www.simple-talk.com/dotnet/.net-framework/the-dangers-of-the-large-object-heap/
Эта проблема хорошо известна в команде разработчиков.NET FX, и над ней постоянно работали. Существует большая вероятность того, что симптомы исчезнут, если использовать более свежие версии FX.
Начиная с.NET 4.5.1, будет вызов метода GC, чтобы даже сжать LOH: http://blogs.msdn.com/b/mariohewardt/archive/2013/06/26/no-more-memory-fragmentation-on-the-large-object-heap.aspx Тем не менее, найти основную причину LOHF было бы гораздо эффективнее, чем просто стереть кучу, тратящую тонны мс
Дайте мне знать, если вам нужны подробности, как изолировать такие эффекты.
Себ