Что именно делает gc_heap::plan_phase?

Я пытаюсь отладить службу Windows .net, которая проводит много времени в GC.

Используя windbg во время сборов, я обнаружил, что большая часть времени уходит на:

00000000`0279e8e0 00000642`7f5368a3 mscorwks!WKS::gc_heap::plan_phase+0x50c
00000000`0279ea90 00000642`7f94ef4e mscorwks!WKS::gc_heap::gc1+0x73
00000000`0279eae0 00000642`7f51c259 mscorwks!WKS::gc_heap::garbage_collect+0x29e
00000000`0279eb40 00000642`7f4eb56e mscorwks!WKS::GCHeap::GarbageCollectGeneration+0x199
00000000`0279ebd0 00000642`7f4ea49d mscorwks!WKS::gc_heap::try_allocate_more_space+0x38e
00000000`0279eca0 00000642`7f4e9cef mscorwks!WKS::GCHeap::Alloc+0x6d
00000000`0279ecd0 00000642`7f9b35da mscorwks!FastAllocateObject+0xaf

Шаблон коллекций Gen0, Gen1, Gen2 является разумным (100,10,1)

Обратите внимание, что приложение работает на x64 и имеет очень большую кучу:

Gen0    10M
Gen1    26K
Gen2    4,371M
Large   3,500M

Примечание: я знаю о замечательном блоге Тесс Феррандес.


person Luca Martinetti    schedule 22.07.2009    source источник


Ответы (2)


plan_phase — это одна из фаз, которую выполняет сборщик мусора. GC имеет 2 фазы: 1- Фаза маркировки: на этой фазе все живые (доступные объекты) помечаются путем следования корням к этим объектам, в зависимости от типа коллекции (Gen0,1 или 2), мы помечаем определенную часть кучи ( Gen0,1) или вся куча (коллекции Gen 2)

2- Фаза планирования: после того, как мы отметили живые объекты, мы знаем некоторые вещи о куче, такие вещи, как фрагментация и соотношение живого объекта по сравнению с размером кучи и т. д. На этапе планирования мы решаем, какое решение GC лучше: следует ли нам выполнять уплотняющую сборку мусора (занимает больше времени, но помогает, когда у вас большая фрагментированная куча) или мы должны принимать общее решение (очень быстро, просто создайте свободный список объектов).

У вас есть куча ~ 4 ГБ Gen2, это большая куча, и ее сбор может занять некоторое время.
Я не уверен, когда вы упомянули «большое время», что вы имели в виду ( количественные показатели? ), это 100 мс, секунды, минуты?

person mfawzymkh    schedule 22.07.2009
comment
Спасибо за хороший ответ. Около 5 сек. Должен ли я рассматривать идею о том, что моя куча фрагментирована? Как GC решает сделать полную коллекцию gen2, а не только gen0. Все данные загружаются при запуске процесса и никак не меняются во время выполнения - person Luca Martinetti; 23.07.2009

Рискну предположить, что это этап маркировки GC, на котором он идентифицирует объекты, у которых нет корней и которые необходимо собрать. Это просто предположение, поскольку информации об этом не так много (я уверен, вы знаете).

person Andrew Hare    schedule 22.07.2009