2009-07-22 1 views
1

GCで多くの時間を費やしている.net Windowsサービスをデバッグしようとしています。コレクション中にwindbgのを使用して正確にgc_heap :: plan_phaseは何をしますか?

は、私はほとんどの時間をに費やされていることを発見:

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 

注:私は偉大なテスFerrandezブログについて知っています。

答えて

0

これは、ルーツを持たず収集する必要があるオブジェクトを識別するGCのマーキング段階であると推測されます。これは、あなたが知っていると確信しているように、これに関する多くの情報がないように見えるので、単に推測です。

1

plan_phaseは、GCが実行するフェーズの1つです。 GCには2つのフェーズがあります 1-マークフェーズ:このフェーズでは、すべてのライブ(到達可能なオブジェクト)はコレクションタイプ(Gen0,1または2)に応じてこれらのオブジェクトのルーツに続いてマークされます。ヒープ(Gen0,1)、またはヒープ全体(Gen2コレクション)

2フェーズ:ライブオブジェクトにマークを付けると、ヒープに関する特定の事柄、ライブオブジェクトの断片化や配給などが比較されますヒープサイズなど。 計画フェーズでは、GCを圧縮する(時間がかかりますが、フラグメントヒープが高い場合に役立ちます)か、徹底的に判断する必要がありますか(非常に高速、オブジェクトのリスト)。

〜4GBのGen2ヒープがあります。これは大きなヒープで、収集に時間がかかることがあります。
"大時間"と書かれたとき、私は何を意味しましたか(量的測定?)、それは100ms、秒、分ですか?

+0

お返事ありがとうございます。約5秒。私のヒープが断片化しているという考えを考慮する必要がありますか? GCはgen0の代わりに完全なgen2コレクションを行う方法をどのように決定しますか?すべてのデータはプロセス起動時にロードされ、実行中はまったく変更されません –