2012-03-14 14 views
9

は私が制御することができる二つのパラメータについて混乱していたときでCMSコレクタキック:CMSのガベージコレクタ - いつ実行されますか?

MaxHeapFreeRatio(デフォルトでは70%)

CMSInitiatingOccupancyFraction(デフォルトでは90%以上)、それらのそれぞれを何

パラメータは、正確にはどういう意味ですか?コレクタはいつ始まり(マーキング段階)、収集(スイープ段階)?

答えて

11

CMSInitiatingOccupancyFractionは、CMSがいつ起動するかを決定します(このオプションを有効にするには、XX:+ UseCMSInitiatingOccupancyOnlyも設定する必要があります)。 MaxHeapFreeRatioは、世代間スペースのサイズを設定するオプションです。

例えば見る

http://java.sun.com/docs/hotspot/gc1.4.2/faq.html

同時コレクションは、一般的にスピードアップすることはできませんが、それは早く開始することができます。 古い世代の割り当て済みスペースのパーセンテージがしきい値を超えると、同時収集が開始されます。このしきい値は、コンカレント・コレクタに関する一般的な経験に基づいて計算されます。完全なコレクションが発生している場合は、そのコレクションを先に開始する必要があります。コマンドラインフラグCMSInitiatingOccupancyFractionを使用すると、コレクションの開始レベルを設定できます。デフォルト値は約68%です。値を調整するためのコマンドラインがある -XX:CMSInitiatingOccupancyFraction =

http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html

はデフォルトでは、仮想マシンが成長するかでオブジェクトを生きるための空き領域の割合を維持しようとする各コレクションでヒープを縮小各コレクションは特定の範囲内にあります。このターゲット範囲は、パラメータ-XX:MinHeapFreeRatio =および-XX:MaxHeapFreeRatio =でパーセンテージとして設定され、合計サイズは-Xms以上で-Xmxで下限に制限されます。 32ビットSolarisオペレーティングシステム(SPARC版)のデフォルトのパラメータは、この表に示されている:

..または..

http://www.petefreitag.com/articles/gctuning/

-XX:MaxHeapFreeRatio - 場合フリーの百分率世代内の空間がこの値を超えると、世代はこの値を満たすために縮小します。デフォルトは70

EDIT:バイト配列のマップをランダムに作成してコピーするテストプログラムでいくつかのシミュレーションを実行しました。私は、a)分数価値が尊重されていないこと、特に、50%の占有率をはるかに上回っているCMS初期マーク段階、典型的には約70-80%を保守的な価値(例えば50)で示し、b)初期の段階では、以前の 起こる(プログラムを-Xmx1536m -Xmx1536m -XX使用:NewSizeパラメータ= 512メートル-XX:+ UseConcMarkSweepGCを+ GCロギングおよび2つのテストパラメータ)私もこれについては、古いバグレポートを見つけた

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6486089

+3

'-XX:+ UseCMSInitiatingOccupancyOnly'が設定されていない限り、' CMSInitiatingOccupancyFraction'は第1のコレクションに対してのみ使用されます。後者のスイッチを設定しないと、最初のスイッチの後に、通常のヒューリスティック(実行時に収集された割り当て統計に基づく)が使用され、CMSの起動時が決まります。 – Matt

+0

ありがとうマット、私はそれを追加しました。 – moodywoody

+0

いくつかの観測から、それは90%(CMSInitiatingOccupancyです。)に達するまで、それは少しの時間がかかりませんでした。しかし、日中はそれほど時間がかかりませんが、より早く収集します。これは@Mattが言ったことに対応しているようですが、この場合はいつものヒューリスティックスが何であり、どのくらいの間平和の時間がそれを休止し、90%以上のしきい値を待つかを知りたいです。 –