2009-07-22 3 views
1

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

Использование 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 

Примечание: Я знаю о великом блоге Tess Ferrandez.

ответ

0

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

1

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

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

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

+0

Спасибо за хороший ответ. Около 5 сек. Должен ли я рассмотреть идею о том, что моя куча фрагментирована? Как GC решает сделать полную коллекцию gen2, а не только gen0. Все данные загружаются при запуске процесса и вообще не изменяются во время выполнения –