30

GC.RegisterForFullGCNotificationGC 通知を受け取りたい場合 (たとえば、収集中にノード間で負荷を転送する場合)、 、 、GC.WaitForFullGCApproachおよびの 3 つのメソッドを使用できますが、GC.WaitForFullGCCompleteに渡されるパラメーターはGC.RegisterForFullGCNotificationほとんど意味がないように見えます。適切な値を選択する方法について説明します。ここからのように、あいまいなメモがあります:

maxGenerationThreshold および largeObjectHeapThreshold パラメーターを指定するには、次のガイドラインを使用します。

しきい値が大きいほど、コレクションが発生する可能性が高くなり、通知が早く発生します。

しきい値が大きいほど、ランタイムが近づいているコレクションをチェックする機会が増えます。これにより、通知される可能性が高くなります。ただし、しきい値を高く設定しすぎると、ランタイムが次のコレクションを誘導するまでの待機時間が長くなるため、設定しないでください。

高いしきい値を使用して通知時に自分でコレクションを誘導すると、ランタイムの次のコレクションによって回収されるよりも多くのオブジェクトが回収されます。

しきい値が小さいほど、収集が早く行われ、通知が遅くなる可能性が高くなります。

またはここから

maxGenerationThresholdジェネレーション 2 でプロモートされたオブジェクトに基づいて、いつ通知を発生させるかを指定する 1 から 99 までの数値。

largeObjectHeapThreshold大きなオブジェクト ヒープに割り当てられているオブジェクトに基づいて、いつ通知を発生させるかを指定する 1 ~ 99 の数値。

大きすぎる値を指定すると、通知を受け取る可能性は高くなりますが、ランタイムがコレクションを開始するまでの待機時間が長すぎる可能性があります。自分でコレクションを誘導すると、ランタイムによってコレクションが発生した場合に回収されるよりも多くのオブジェクトが回収される可能性があります。

小さすぎる値を指定すると、通知を受けるのに十分な時間が経過する前に、ランタイムによってコレクションが発生する可能性があります。

ただし、「高すぎず、低すぎない」ことを除いて、それは賢明な/正しい数値を選択するのに実際には役立ちません.

現在、提供されているいくつかの例の1つを使用しています。

// these are magic numbers; nobody really knows what they mean...
GC.RegisterForFullGCNotification(10, 10);

10しかし... が正しい選択なのか、10恣意的な選択なのか、特定の使用シナリオを反映するためにこれをどのように変更すべきなのかは非常に不明です。

だから:これらの数字を選ぶ正しい方法はありますか?それとも、イベントの取得が早すぎる/遅すぎるかどうかに基づいて、試行錯誤しているだけですか?

4

1 に答える 1

11

これらのパラメーターを選択する上で見つけた最良の答えは、http://assets.red-gate.com/community/books/assets/Under_the_Hood_of_.NET_Management.pdfにあります。

RegisterForFullGC 通知の呼び出しに含まれる魔法の定数について疑問に思われるかもしれません。このメソッドは、maxGenerationThreshold と largeObjectHeapThreshold の 2 つのパラメーターを取ります。どちらのパラメーターも 1 から 99 までの整数にすることができます。これらのパラメーターの値が大きいほど、通知が早く発生し、値が小さいほど、イベントが実際に発生するときにより近く通知が発生します。

最初のパラメーターを使用すると、第 2 世代まで生き残ったオブジェクトの数に基づいて通知を受け取るように指定できます。2 番目のパラメーターを使用すると、Large Object Heap のサイズに基づいて通知を受け取るように指定できます。ただし、どちらのパラメーターも絶対値を指定しないため、maxGenerationThreshold に 30 を渡すことは、ジェネレーション 2 に 30 個のオブジェクトがある場合に通知をトリガーすることを意味しません。これは単に、値 10 を渡した場合よりも早く通知を受け取りたいということを意味します。特定のトリガーに他のトリガーよりも関心がある場合を除き、各パラメーターに同じ値を渡すことをお勧めします。トリガーに関係なく、同じ段階で確実に通知されるようにします。

値を大きくすると、メモリ プレッシャーに対処する時間が長くなりますが、値を高く設定しすぎないように注意する必要があります。しきい値を高く設定するほど、通知は速くなりますが、GC での待機時間が長くなります。アプリケーションでこれらのパラメーターを試して、負荷に最適なものと、メモリを消費するオブジェクトの種類を確認してください。

したがって、答えとしては、上記に基づいて、主に試行錯誤ですが、各パラメーターに使用する 2 つの値は同じである可能性があります。

于 2012-10-22T01:51:20.873 に答える