web-dev-qa-db-ja.com

Java 7(JDK 7)ガベージコレクションとG1に関するドキュメント

Java 7はしばらく前にリリースされましたが、ガベージコレクターの構成、特に新しいG1コレクターの構成に関する適切なリソースが見つかりません=。

私の質問:

  1. G1はJava 7のデフォルトコレクターですか。そうでない場合は、G1をアクティブにする方法を教えてください。
  2. Java7でg1にはどのようなオプション設定がありますか?
  3. cmsparallelコレクターなどの他のコレクターに変更があったかJava 7で?
  4. Java 7のガベージコレクションに関する適切なドキュメントはどこにありますか?
80
Florakel

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.

良いドキュメントがどこにあるかわかりません。

47
Carey

OracleはJava 7 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

それでも、それはJava 7のデフォルトコレクターではないと思います。サーバーの場合、デフォルトはJava 6のようなパラレルコレクターです。

31
Florakel

はい、G1はJava 1.7 JVMの新しい標準ガベージコレクターです。

ここ 新しいガベージコレクタの使用方法と設定方法に関する多くの情報を見つけることができます。

G1の使用G1はまだ実験的であると見なされており、次の2つのパラメーターで有効にできます。

-XX:+ UnlockExperimentalVMOptions -XX:+ UseG1GC

GCの一時停止時間の目標を設定するには、次のパラメーターを使用します。

-XX:MaxGCPauseMillis = 50(50msの休止時間ターゲットの場合)

G1では、GCの一時停止が上記の時間より長くない時間間隔を指定できます。

-XX:GCPauseIntervalMillis = 200(200msの休止間隔ターゲットの場合)

上記の2つのオプションは、約束や保証ではなく、目標を表していることに注意してください。それらはある状況ではうまく機能するかもしれませんが、他の状況ではうまくいかないかもしれません。

あるいは、避難ポーズ時間に影響を与えるために、若い世代のサイズを明示的に指定できます。

-XX:+ G1YoungGenSize = 512m(512メガバイトの若い世代の場合)

G1は、サバイバースペースに相当するものも使用します。サバイバースペースは、当然、一連の(潜在的に不連続な)領域です。サイズは通常のパラメーターで指定できます(例:-XX:SurvivorRatio = 6)。

最後に、G1を最大限に実行するには、まれに競合状態が明らかになる可能性があるため、現在デフォルトで無効になっている次の2つのパラメーターを設定してみてください。

-XX:+ G1ParallelRSetUpdatingEnabled -XX:+ G1ParallelRSetScanningEnabled

注意すべきもう1つの点は、-XX:+ PrintGCDetailsが設定されている場合、G1は他のHotSpot GCと比較して非常に冗長であることです。これは、GCスレッドごとのタイミングと、プロファイリングとトラブルシューティングに非常に役立つその他の情報を出力するためです。より簡潔なGCログが必要な場合は、-verbosegcの使用に切り替えてください(ただし、より詳細なGCログを取得することをお勧めします)。

また、G1の内部を理解するのに非常に役立つ this の記事も見つけました。

さらに詳しい情報 こちら

22

1。 G1はJava 7(...)のデフォルトコレクターです

this Java 5 page のルールは、Java 7(およびAFAIK、Java 8)でも引き続き適用可能です。

server-class サーバーVMを実行しているマシンでは、ガベージコレクター(GC)が以前のシリアルコレクター(-XX:+ UseSerialGC)からパラレルコレクター(-XX:+ UseParallelGC)に変更されました。

ただし、次のことも考慮してください。

  • 64ビットJVMには-client VMが付属していないため、常に「サーバークラス」です
  • Java 7以降、-XX:+ UseParallelGC(設定または暗黙)を使用すると、-XX:+ UseParallelOldGC(つまり、明示的に無効にされない限り)

たとえば、Windows x64で実行する場合...

  • Java 7 64ビットでは、デフォルトでParallel GC(若い世代と古い世代の両方)を取得します。
  • Java 8 32ビット、デフォルトでシリアルGC(両方の世代)を取得

1。 (...)G1をアクティブにするにはどうすればよいですか?

Java 7の時点では、単に-XX:+UseG1GCだけです。おそらくまた興味深いのは when あなたがしたいことです:

CMSまたはParallelOldガベージコレクターで現在実行されているアプリケーションは、アプリケーションに次の特性が1つ以上ある場合、G1に切り替えると便利です。

  • Javaヒープの50%以上がライブデータで占有されています。
  • オブジェクトの割り当て率または昇格の率は大きく異なります。
  • 望ましくない長いガベージコレクションまたは圧縮の一時停止(0.5〜1秒より長い)

2。 g1にはJava7でどのようなオプション設定がありますか?

私自身はG1を使用していませんが、他の並列コレクターを調整するために使用されるのと同じ基本的な「スループット/人間工学的」フラグに準拠していることを I gather しました。 Parallel GCでの私の経験では、-XX:GCTimeRatioは、予想される速度とメモリのトレードオフを提供する上で極めて重要なものでした。 YMMV。

G1固有のオプションがリストされています here

3。 Java 7の(...)cmsまたはパラレルコレクターに変更がありましたか?

わからない、 しかし...

G1は、Concurrent Mark-Sweep Collector(CMS)の長期的な代替品として計画されています。

4。 Java 7のガベージコレクションに関する適切なドキュメントはどこにありますか?

見つけるのは苦痛かもしれませんね。おそらく私が見つけた最高の「ハブ」ページはこれです:

http://www.Oracle.com/technetwork/Java/javase/tech/index-jsp-140228.html

ある程度の深い読みが必要ですが、チューニングを行う必要がある場合は時間をかける価値があります。特に洞察力があります: ガベージコレクターの人間工学

13
Luke Usherwood
  1. G1はJava 7のデフォルトコレクターですか。そうでない場合は、G1をアクティブにする方法を教えてください。

G1はJava 7.のデフォルトコレクターではありません。-XX:+UseG1GCはG1GCを有効にします

  1. Java7でg1にはどのようなオプション設定がありますか?

沢山あります。完全な情報については、こちらをご覧ください Oracle 記事。

G1 GCは、変更なしで効率的に動作できるようにするデフォルトの適応型ガベージコレクターです。

この理由により、重要なパラメーターをカスタマイズします

-XX:MaxGCPauseMillis
-XX:G1HeapRegionSize
-XX:ParallelGCThreads
-XX:ConcGCThreads

、他のすべてのパラメーターはデフォルト値のままにします

重要なオプションとそのデフォルト値のリストを次に示します。このリストは、最新のJava HotSpot VM、ビルド24に適用されます。JVMコマンドラインでG1 GC設定を調整および調整できます。

重要なデフォルト:

-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コアに基づいています。不要なパラメーターの再構成を削除します。

推奨事項 Oracleから:

G1 GCを評価して微調整するときは、次の推奨事項に留意してください。

  1. 若い世代サイズ-Xmnオプションまたは-XX:NewRatioなどのその他の関連オプションを使用して、若い世代サイズを明示的に設定しないでください。 若い世代のサイズを固定すると、ターゲットの一時停止時間の目標が上書きされます

  2. 一時停止時間の目標:ガベージコレクションを評価または調整する場合、常にレイテンシとスループットのトレードオフがあります。 G1 GCは、一定の休止時間を持つ増分ガベージコレクターですが、アプリケーションスレッドのオーバーヘッドも大きくなります。 G1 GCのスループット目標は、アプリケーション時間の90パーセントとガベージコレクション時間の10パーセントです

  1. Java 7のcmsやパラレルコレクターなどの他のコレクターに変更はありましたか?

Java 7.にはいくつかの変更点があります。これをご覧ください 記事

  1. Java 7のガベージコレクションに関する適切なドキュメントはどこにありますか?

gc および関連するSEの質問については、Oracleのドキュメントページを参照してください。

本番環境のJava G1ガベージコレクション

10
Ravindra babu

Jdk 1.7.0_02では、G1はデフォルトのガベージコレクターではありません。デフォルトのガベージコレクタは、マシンのクラスに依存します。マシンがServerクラスの場合、デフォルトのガベージコレクタはスループットコレクタです。マシンがクライアントクラスの場合、デフォルトのガベージコレクタはシリアルコレクタです。

2
Nitan S. Kotwal

http://www.Oracle.com/technetwork/Java/javase/tech/g1-intro-jsp-135488.html (Wojtekが提供するリンク)にあるドキュメントのみが、情報との公式リンクですが、そこに記載されているフラグの一部はテストビルドでのみ使用可能であり、本番リリースには存在しないため、情報は古くなっているようです。 Oracleの誰かがG1 GCに関する更新されたドキュメントを提供する必要があります。

2
IceMan

デフォルトでは、他のG1コレクターよりも優れているとは限らないため、G1コレクターを実際に使用する必要はありません。特別な目的にのみ適しています。

低遅延のアプリケーションは、CMSよりもわずかに短く、休止時間がより予測しやすいため、CMSよりもわずかに優れています。交換では、スループットは交換のCMSよりもはるかに劣ります。

したがって、レイテンシが重要な場合にのみ有効ですが、スループットはまったく重要ではありません。両方が重要な場合は、CMSのままにしてください。

0
Zoltan Juhasz