Java 7はしばらくの間リリースされていますが、ガベージコレクター、特に新しいG1コレクターの構成に関する適切なリソースが見つかりません。
私の質問:
- G1はJava7のデフォルトのコレクターですか?そうでない場合、G1をアクティブ化するにはどうすればよいですか?
- g1にはJava7でどのようなオプション設定がありますか?
- cmsやJava7の並列コレクターなどの他のコレクターに変更が加えられましたか?
- Java 7のガベージコレクションに関する優れたドキュメントはどこにありますか?
Java 7はしばらくの間リリースされていますが、ガベージコレクター、特に新しいG1コレクターの構成に関する適切なリソースが見つかりません。
私の質問:
回答:
G1ガベージコレクターは、Javaのインストールバージョン1.7.0_01のデフォルトではありません。いくつかの追加のコマンドラインオプションを使用して、自分で確認できます。
> java -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -version
-XX:InitialHeapSize=132304640 -XX:MaxHeapSize=2116874240 -XX:ParallelGCThreads=4 -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
java version "1.7.0_01"
Java(TM) SE Runtime Environment (build 1.7.0_01-b08)
Java HotSpot(TM) 64-Bit Server VM (build 21.1-b02, mixed mode)
Heap
PSYoungGen total 37696K, used 1293K [0x00000007d5eb0000, 0x00000007d88c0000, 0x0000000800000000)
eden space 32320K, 4% used [0x00000007d5eb0000,0x00000007d5ff3408,0x00000007d7e40000)
from space 5376K, 0% used [0x00000007d8380000,0x00000007d8380000,0x00000007d88c0000)
to space 5376K, 0% used [0x00000007d7e40000,0x00000007d7e40000,0x00000007d8380000)
PSOldGen total 86144K, used 0K [0x0000000781c00000, 0x0000000787020000, 0x00000007d5eb0000)
object space 86144K, 0% used [0x0000000781c00000,0x0000000781c00000,0x0000000787020000)
PSPermGen total 21248K, used 2032K [0x000000077ca00000, 0x000000077dec0000, 0x0000000781c00000)
object space 21248K, 9% used [0x000000077ca00000,0x000000077cbfc288,0x000000077dec0000)
ただし、G1コレクターをオンにするために実験オプションを有効にする必要はありません。
> java -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseG1GC -version
-XX:InitialHeapSize=132304640 -XX:MaxHeapSize=2116874240 -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseCompressedOops -XX:+UseG1GC -XX:-UseLargePagesIndividualAllocation
java version "1.7.0_01"
Java(TM) SE Runtime Environment (build 1.7.0_01-b08)
Java HotSpot(TM) 64-Bit Server VM (build 21.1-b02, mixed mode)
Heap
garbage-first heap total 130048K, used 0K [0x000000077ca00000, 0x0000000784900000, 0x00000007fae00000)
region size 1024K, 1 young (1024K), 0 survivors (0K)
compacting perm gen total 20480K, used 2032K [0x00000007fae00000, 0x00000007fc200000, 0x0000000800000000)
the space 20480K, 9% used [0x00000007fae00000, 0x00000007faffc288, 0x00000007faffc400, 0x00000007fc200000)
No shared spaces configured.
良いドキュメントがどこにあるかわかりません。
-XX:+UseParallelGC
。
オラクルはついにJava7 U4でG1を公式にしました:http: //www.oracle.com/technetwork/java/javase/7u4-relnotes-1575007.html
説明:http: //docs.oracle.com/javase/7/docs/technotes/guides/vm/G1.html
コマンドラインオプション:http: //www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html#G1Options
それでも、Java7のデフォルトのコレクターではないと思います。サーバーの場合、デフォルトはJava6のParallelCollectorです。
はい、G1はJava 1.7JVMの新しい標準ガベージコレクターです。
ここでは、新しいガベージコレクターの使用方法と構成方法に関する多くの情報を見つけることができます。
G1の使用G1はまだ実験的なものと見なされており、次の2つのパラメーターで有効にできます。
-XX:+ UnlockExperimentalVMOptions -XX:+ UseG1GC
GC一時停止時間の目標を設定するには、次のパラメータを使用します。
-XX:MaxGCPauseMillis = 50(50msの一時停止時間ターゲットの場合)
G1を使用すると、GCの一時停止が上記の時間より長く続かない時間間隔を指定できます。
-XX:GCPauseIntervalMillis = 200(200msの一時停止間隔ターゲットの場合)
上記の2つのオプションは、約束や保証ではなく、目標を表すことに注意してください。それらは状況によってはうまく機能するかもしれませんが、他の状況ではうまく機能しないかもしれませんし、GCは常にそれらに従うことができるとは限りません。
あるいは、若い世代のサイズを明示的に指定して、避難の一時停止時間に影響を与えることもできます。
-XX:+ G1YoungGenSize = 512m(512メガバイトの若い世代の場合)
G1は、サバイバースペースに相当するものも使用します。これは、当然、(潜在的に非隣接の)領域のセットです。それらのサイズは、通常のパラメーター(たとえば、-XX:SurvivorRatio = 6)で指定できます。
最後に、G1を最大限に実行するには、まれな競合状態が明らかになる可能性があるため、現在デフォルトで無効になっている次の2つのパラメーターを設定してみてください。
-XX:+ G1ParallelRSetUpdatingEnabled -XX:+ G1ParallelRSetScanningEnabled
もう1つ注意すべき点は、-XX:+ PrintGCDetailsが設定されている場合、G1は他のHotSpotGCと比較して非常に冗長であるということです。これは、GCスレッドごとのタイミングや、プロファイリングやトラブルシューティングに非常に役立つその他の情報を出力するためです。より簡潔なGCログが必要な場合は、-verbosegcの使用に切り替えてください(ただし、より詳細なGCログを取得することをお勧めします)。
また、この記事はG1の内部を理解するのに非常に役立つことがわかりました。
さらに詳しい情報はこちら。
1.G1はJava7のデフォルトのコレクターですか(...)
このJava5ページのルールは、Java 7(およびAFAIK、Java 8)にも引き続き適用されます。
上のサーバクラスのパラレルコレクタ(-XX:+ UseParallelGC):サーバーVMを実行しているマシン、ガベージコレクタ(GC)が、前のシリアルコレクタ(+ UseSerialGC -XX)から変更されました。
しかし、次のことも考慮してください。
-client
VMが付属していないため、常に「サーバークラス」です。たとえば、Windowsx64で実行する場合...
1。(...)G1をアクティブ化するにはどうすればよいですか?
Java 7以降、単純に-XX:+UseG1GC
。おそらくまた興味深いのは、次のことをしたいときです。
CMSまたはParallelOldガベージコレクターのいずれかを使用して現在実行されているアプリケーションは、アプリケーションに次の特性が1つ以上ある場合、G1に切り替えると便利です。
- Javaヒープの50%以上がライブデータで占められています。
- オブジェクトの割り当て率またはプロモーションの率は大幅に異なります。
- 望ましくない長いガベージコレクションまたは圧縮の一時停止(0.5〜1秒より長い)
2. Java7でg1にはどのようなオプション設定がありますか?
私はG1自分自身を使用していませんでしたが、私が集まることは同じ基本的に従っていること、「スループット/人間工学に基づいた」他の並列コレクターのチューニングに使用されるフラグ。Parallel GCでの私の経験では-XX:GCTimeRatio
、期待される速度とメモリのトレードオフを提供する上で極めて重要なものでした。YMMV。
3. Java 7の(...)cmsまたは並列コレクターに変更がありましたか?
わからないけど...
G1は、コンカレントマークスイープコレクター(CMS)の長期的な代替品として計画されています。
4. Java 7のガベージコレクションに関する優れたドキュメントはどこにありますか?
見つけるのは苦痛かもしれませんね。おそらく私が見つけた最高の「ハブ」ページはこれです:
http://www.oracle.com/technetwork/java/javase/tech/index-jsp-140228.html
ある程度の深い読みが必要ですが、調整が必要な場合は時間の価値があります。特に洞察に満ちているのは:ガベージコレクターの人間工学
- G1はJava7のデフォルトのコレクターですか?そうでない場合、G1をアクティブ化するにはどうすればよいですか?
G1は-XX:+UseG1GC
Java7のデフォルトのコレクターではありません。G1GCが有効になります。
- g1にはJava7でどのようなオプション設定がありますか?
沢山あります。完全な情報については、このオラクルの記事をご覧ください。
G1 GCは、変更なしで効率的に動作できるようにするデフォルトの適応型ガベージコレクターです。
このため、重要なパラメータをカスタマイズしてください
-XX:MaxGCPauseMillis
-XX:G1HeapRegionSize
-XX:ParallelGCThreads
-XX:ConcGCThreads
他のすべてのパラメータはデフォルト値のままにします。
重要なオプションとそのデフォルト値のリストを次に示します。このリストは、最新のJava HotSpot VM、ビルド24に適用されます。JVMコマンドラインでG1GC設定を調整および調整できます。
重要なデフォルト:
-XX:G1HeapRegionSize=n
G1領域のサイズを設定します。値は2の累乗で、1MBから32MBの範囲で指定できます。目標は、Javaヒープの最小サイズに基づいて約2048のリージョンを持つことです。
-XX:MaxGCPauseMillis=200
希望する最大休止時間の目標値を設定します。デフォルト値は200ミリ秒です。指定された値は、ヒープサイズに適合しません。
-XX:G1NewSizePercent=5
若い世代のサイズの最小値として使用するヒープのパーセンテージを設定します。デフォルト値は、Javaヒープの5パーセントです。
-XX:G1MaxNewSizePercent=60
若い世代のサイズの最大値として使用するヒープサイズのパーセンテージを設定します。デフォルト値は、Javaヒープの60パーセントです。
-XX:ParallelGCThreads=n
STWワーカースレッドの値を設定します。nの値を論理プロセッサーの数に設定します。nの値は、値8までの論理プロセッサーの数と同じです。
論理プロセッサーが8つを超える場合は、nの値を論理プロセッサーの約5/8に設定します。これは、nの値が論理プロセッサの約5/16になる可能性がある大規模なSPARCシステムを除いて、ほとんどの場合に機能します。
-XX:ConcGCThreads=n
平行マーキングスレッドの数を設定します。nを並列ガベージコレクションスレッド(ParallelGCThreads)の数の約1/4に設定します。
-XX:InitiatingHeapOccupancyPercent=45
マーキングサイクルをトリガーするJavaヒープ占有しきい値を設定します。デフォルトの占有率は、Javaヒープ全体の45パーセントです。
-XX:G1MixedGCLiveThresholdPercent=65
混合ガベージコレクションサイクルに含まれる古いリージョンの占有しきい値を設定します。デフォルトの占有率は65パーセントです
-XX:G1HeapWastePercent=10
無駄にすることをいとわないヒープのパーセンテージを設定します。Java HotSpot VMは、再利用可能な割合がヒープ廃棄物の割合よりも少ない場合、混合ガベージコレクションサイクルを開始しません。
-XX:G1MixedGCCountTarget=8
最大でG1MixedGCLIveThresholdPercentライブデータを持つ古いリージョンを収集するために、マーキングサイクル後の混合ガベージコレクションのターゲット数を設定します。デフォルトは8つの混合ガベージコレクションです
-XX:G1OldCSetRegionThresholdPercent=10
混合ガベージコレクションサイクル中に収集される古いリージョンの数に上限を設定します。デフォルトはJavaヒープの10パーセントです
-XX:G1ReservePercent=10
スペースへのオーバーフローのリスクを減らすために、空きを保持する予備メモリの割合を設定します。デフォルトは10パーセントです。パーセンテージを増減するときは、Javaヒープの合計を同じ量だけ調整してください。
多くのG1GCパラメータを再構成しましたが、上記のドキュメントページに従う場合は必要ありません。特にParallelGCThreadsとConcGCThreadsについては、上記の推奨事項と照合してください。これらはCPUコアに基づいています。不要なパラメータの再構成を削除します。
オラクルからの推奨事項:
G1 GCを評価および微調整するときは、次の推奨事項に留意してください。
若い世代のサイズ:-Xmn
オプションまたはその他の関連オプション(など)を使用して若い世代のサイズを明示的に設定することは避けてください-XX:NewRatio
。 若い世代のサイズを修正すると、ターゲットの一時停止時間の目標が上書きされます。
一時停止時間の目標:ガベージコレクションを評価または調整する場合、レイテンシとスループットのトレードオフが常にあります。G1 GCは、一時停止が均一なインクリメンタルガベージコレクタですが、アプリケーションスレッドのオーバーヘッドも大きくなります。G1 GCのスループットの目標は、90%のアプリケーション時間と10%のガベージコレクション時間です。
- cmsやJava7の並列コレクターなどの他のコレクターに変更が加えられましたか?
Java7にはいくつかの変更があります。この記事をご覧ください
- Java 7のガベージコレクションに関する優れたドキュメントはどこにありますか?
gcおよび関連するSEの質問については、Oracleのドキュメントページを参照してください。
jdk1.7.0_02ではG1はデフォルトのガベージコレクタではありません。デフォルトのガベージコレクターは、マシンのクラスによって異なります。マシンがサーバークラスの場合、デフォルトのガベージコレクターはスループットコレクターです。マシンがクライアントクラスの場合、デフォルトのガベージコレクターはシリアルコレクターです。
http://www.oracle.com/technetwork/java/javase/tech/g1-intro-jsp-135488.html(Wojtekが提供するリンク)で入手できるドキュメントは、情報を含む唯一の公式リンクのようですが、そこに記載されているフラグの一部はテストビルドでのみ使用可能であり、製品リリースには存在しないため、古くなっているようです。Oracleの誰かが、G1GCに関する更新されたドキュメントを提供する必要があります。