.Net Garbage Collector - Посмотрите, что повышен до Gen2 во время выполнения - PullRequest
8 голосов
/ 07 марта 2011

Моя программа продвигает память к Gen2 с очень высокой скоростью (около 1 МБ / с), и это вызывает снижение производительности при сборе Gen2.Каждая попытка понять, какие объекты были продвинуты, провалилась - в основном из-за того, что когда я открывал 2 дампа в windbg, память, из которой было сделано увеличение размера Gen2, была помечена как «Свободная».Это заставило меня заподозрить, что закрепленные объекты являются причиной проблемы, но статистика perfmon показывает, что число закрепленных объектов очень мало (около 2-4).

Теперь я пытаюсь выяснить, какие именнообъекты повышаются до Gen2 во время выполнения.Есть ли способ сделать это?

Ответы [ 4 ]

5 голосов
/ 07 марта 2011

Вы можете использовать WinDbg для устранения таких проблем. Установите точку останова в подпрограмме сбора мусора, проверьте управляемую кучу, дайте возможность собрать мусор, затем снова проверьте управляемую кучу, чтобы увидеть, какие объекты находятся в Gen2 сейчас.

Вот несколько ссылок для начала:

Отслеживание утечек управляемой памяти

Как перебирать объекты, присутствующие в управляемой куче .NET?

Блог Тесс Феррандез

Исследование управления памятью .NET и сбора мусора

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

2 голосов
/ 07 марта 2011

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

1 голос
/ 07 марта 2011

Вы могли бы выделить много LOH. Вот способ иметь точку останова на распределении LOH. bp mscorwks!wks::gc_heap::allocate_large_object “!CLRStack” в Winbdg.

НТН

0 голосов
/ 07 марта 2011

Вы можете попытаться форсировать коллекции gen (0) и gen (1) и сделать моментальный снимок сразу после его завершения

GC.Collect(1,GCCollectionMode.Forced);
GC.WaitForPendingFinalizers();
CreateDump();

Кроме того, какой тип GC вы используете?

...