究竟gc_heap :: plan_phase到底是什么?

时间:2009-07-22 13:33:56

标签: .net performance garbage-collection

我正在尝试调试一个花费大量时间在GC上的.net Windows服务。

在收藏期间使用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博客。

2 个答案:

答案 0 :(得分:1)

plan_phase是GC的一个阶段。 GC有两个阶段 1-标记阶段:在此阶段,所有实时(可到达对象)都通过跟随这些对象的根来标记,这取决于集合类型(Gen0,1或2),我们标记堆的某些部分(Gen0,1),或整堆(第2代收藏)

2-计划阶段:一旦我们标记了活动对象,我们就会知道关于堆的某些事情,例如碎片和活动对象的比例与堆大小相比等等。 在计划阶段,我们决定什么GC决策是最好的,我们应该做一个压缩GC(需要更多时间,但是当你有高碎片堆时有帮助),或者我们应该做一个彻底的决定(非常快,只需要一个免费的清单对象)。

你有~4GB的Gen2堆,这是一个很大的堆,可能需要一些时间来收集它 我不确定你什么时候提到“大时间”,你的意思是什么(定量测量?),是100ms,秒,分钟?

答案 1 :(得分:0)

我猜测这是GC的标记阶段,它标识了没有根并且需要收集的对象。这只是猜测,因为似乎没有太多关于此的信息(我相信你知道)。