2011-12-20 16 views
8

当日は私たちのWindowsサービスでたくさんのGen 2コレクションが見られました。GCは第2世代をいつ収集するのですか?

GenはGen1とGen0のみを収集するのではなく、Gen0のみを収集するのではなく、いつ完全収集を行うかを決定しますか?

+0

多少のメモリを解放するように感じるときでしょうか。システムがアイドル状態のときなどです。ちょうどguessin '。 –

答えて

9

詳細については、http://msdn.microsoft.com/en-us/library/0xy59wtx.aspxとリンクされている記事をお読みください。一般に、gen2は「必要に応じて」収集されます。

Gen2の過剰なコレクションを引き起こす原因の1つは、ラージオブジェクトヒープ(LOH)です。 LOHが満たされると、完全なコレクションがトリガーされます。あなたのアプリケーションが多くの大きなオブジェクト(80K以上)を割り当てたり解放したりするならば、あなたの問題になる可能性があります。

CLR Inside Out: Large Object Heap Uncoveredを参照してください。

サービスでサーバーガベージコレクタを使用することも検討してください。通常、パフォーマンスが向上します(コレクション数が少なくなります)。これをあなたのapp.configファイルに追加してください:

<configuration 
    <runtime> 
     <gcServer enabled="true"/> 
    </runtime> 
</configuration> 
+0

私たちのサービスは、行うべき作業があるかどうかをチェックし、それをThreadPoolに入れます。私はそれらのThreadPool ThreadsがGen2に行く唯一のものだと思います。大きなオブジェクトは割り当てません。しかし、システムメモリが低い場合、Gen2コレクションが表示されます。マルチコアCPUを使用する場合、AFAIKサーバーモードはデフォルトです。 –

+0

@Periシステムメモリが低い場合は、完全なGCがトリガされます。システムはスペースを必要とする! RAMを追加する可能性を検討したいかもしれません。 – Joe

+2

@Peri:いいえ、サーバーモードはデフォルトではありません。マルチコアを使用するときの同時GCはデフォルトですが、依然としてクライアントGCです。サーバーGCが必要な場合は、app.configファイルでその旨を述べる必要があります。また、大きなオブジェクトを割り当てることはありませんか? 64ビットシステムでは、10,000個のアイテムしか含まれていないリストには、80キロバイトを超えるバッキングアレイが必要です。 –

5

一般colletionは、以下の1

  • 割当てが閾値を超えて満たされた場合(任意の世代の下で)トリガされます。私は、現在のニーズに基づいてこれがダイナミックであることを忘れないように覚えています。誰でも確認/拒否できますか?
  • はそれがGC.Collectを経由して呼び出されたメモリ不足
  • ()

は、私が行方不明です別のシナリオがあるかもしれませんがありますが、一般的に、それはそれです。最初の1つはです。通常はコレクションをキックオフし、G2を収集するのは(相対的に)G2よりもコストがかかります。


はコメントで質問に対処するには、次の
各世代がヒットコレクションをトリガするとき、そのしきい値を持っています。 Gen0は5MBになり、それが満たされるとトリガーされます。 GCが実行された後、 まだに5MBがある場合、私はそれが限界を増加させると信じています。それがすべての割り当てよりもなかった場合、コレクションがトリガーされ、問題が発生しています。 Gen2 となります(ここでは数字を書きます)。同じロジックが適用されます。

教科書の例については、簡単なシナリオを見てみましょう。

  1. 新アプリ割り当てられたオブジェクトとすべては、データの3メガバイトの合計Gen0に置かれています。 (これはではなく、常にですが、それはふりをします)
  2. GCがヒットし、その1 MBがG1に移動され、残りがクリーンアップされます。
  3. G0は無料で、G1には1MBが含まれています。
  4. さらに多くのオブジェクトが作成され、より多くのGCが実行されます。しばらくするとG1がいっぱいになり、一部はG2に移動します。
  5. オブジェクトは、G2がいっぱいになるまでそこにとどまり、使用されていなければがクリーニングされます。オブジェクトが依然として参照されている場合、は、それがきれいになるまでG2に留まります。

完全なGCは高価で、何も起こっていないことがあります。これは、64GB以上のRAMが利用可能なシステム上にあったことを認め、その必要はありませんでした。

+0

最初の点ではどういう意味ですか?たとえば、<5MBを割り当てると、Gen0(各割り当てごとに?)、Gen1は5〜10MB、Gen2は10MB以上割り当てます。 –

+0

私はこの例を理解していません。私は世代が「満員」ではなく、GC(生きている)を生き残ったときに、オブジェクトが古い世代に移動したと思う。 –

+0

右、GCが発生したときにキーが押され、「完全」であればそれが蹴られます(または上記の2つの理由の1つ)。私は例としてそれを使っていました。 – Joe

関連する問題