2009-07-22 9 views
1

Ich versuche, einen .net Windows-Dienst zu debuggen, der viel Zeit in GC ausgibt.Was genau macht gc_heap :: plan_phase?

während Sammlungen Mit windbg ich entdeckt, dass die meiste Zeit in ausgegeben wird:

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 

Das Muster der Gen0, Gen1, Sammlungen Gen2 ist angemessen (100,10,1)

Bitte beachten dass die Anwendung auf x64 ausgeführt wird und einen wirklich großen Heap hat:

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

Hinweis: Ich kenne den großen Blog Tess Ferrandez.

Antwort

0

Ich würde vermuten, dass dies die Kennzeichnungsphase des GC ist, in der Objekte identifiziert werden, die keine Wurzeln haben und gesammelt werden müssen. Dies ist einfach eine Vermutung, da es nicht viele Informationen darüber zu geben scheint (wie Sie sicher wissen).

1

plan_phase ist eine der Phasen des GC. Der GC hat 2 Phasen 1- Mark Phase: In dieser Phase werden alle lebenden (erreichbaren Objekte) markiert, indem man den Wurzeln zu diesen Objekten folgt, abhängig von der Art der Sammlung (Gen0,1 oder 2) markieren wir bestimmte Teile der Heap (Gen0,1) oder der gesamte Heap (Gen 2)

2- Planphase: Sobald wir die Live-Objekte markiert haben, wissen wir bestimmte Dinge über den Heap, Dinge wie Fragmentierung und Ration von Live-Objekten verglichen zur Heap-Größe .. etc. Während der Planphase entscheiden wir, welche GC-Entscheidung am besten ist, sollten wir einen compacting GC machen (dauert länger, hilft aber, wenn Sie einen hoch fragmentierten Heap haben), oder sollten wir eine umfassende Entscheidung treffen (sehr schnell, nur kostenlos) Liste von Objekten).

Sie haben ~ 4GB Gen2 Heap, das ist ein großer Haufen und könnte einige Zeit dauern, um es zu sammeln.
Ich bin mir nicht sicher, wann Sie "große Zeit" erwähnt haben, was meintest du (quantitative Maßnahmen?), Ist es 100ms, Sekunden, Minuten?

+0

Danke für die gute Antwort. Ungefähr 5 Sekunden Sollte ich die Idee betrachten, dass mein Heap fragmentiert ist? Wie beschließt der GC, eine vollständige gen2-Sammlung statt nur gen0 zu erstellen? Alle Daten werden beim Prozessstart geladen und ändern sich während der Ausführung überhaupt nicht –