Почему куча больших объектов в основном пуста? - PullRequest
0 голосов
/ 27 июля 2011

Почему управление памятью .NET создает такую ​​большую кучу объектов? Большая часть кажется пустой. Это то, что беспокоит?

Означают ли приведенные ниже данные, что на самом деле в моем приложении только 179 МБ крупных объектов? Получено 179 МБ путем вычитания 983396616 (свободный LOH) из 1171428792 (Heap0 LOH).

Приведенная ниже информация была собрана с помощью WinDbg для файла дампа, созданного в процессе w3wp.exe, т.е. в ASP.NET. Процесс размещен в 64-разрядной операционной системе Windows 2008. Приложение построено с использованием Microsoft .NET Framework 4.0 и ASP.NET MVC 3.

0:025> !HeapStat
Heap             Gen0         Gen1         Gen2          LOH
Heap0         4628496      3840808    319586376   1171428792

Free space:                                                 Percentage
Heap0              24           24      1926224    983396616SOH:  0% LOH: 83%

Ответы [ 2 ]

0 голосов
/ 28 июля 2011

Вы уверены, что большая часть LOH была передана или это просто зарезервированное адресное пространство?

Я только что посмотрел на экземпляр PowerShell.exe здесь с картой виртуальной машины Sysinternal. Это показывает общую кучу GC ~ 390 МБ, но два самых больших блока (~ 240 МБ и ~ 125 МБ) зарезервированы. Выделено менее 20 МБ (т. Е. Выделена физическая память или пространство подкачки).

Чтобы усилить это, общая фиксация процесса составляет ~ 200 МБ, что меньше адресного пространства, выделенного для кучи GC.

0 голосов
/ 28 июля 2011

Я бы предложил запустить! DumpHeap -stat Искать общее значение в байтах для объектов с именем «FREE».Это будут свободные блоки в LOH, доступные для использования, но они были фрагментированы путем уничтожения кучи больших объектов.Если это число близко, значит, вы ударяете по своему LOH множеством недолговечных объектов и оставляете фрагменты свободной памяти (помните, что эта куча никогда не сжимается).

...