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


81

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

私の質問:

  1. G1はJava7のデフォルトのコレクターですか?そうでない場合、G1をアクティブ化するにはどうすればよいですか?
  2. g1にはJava7でどのようなオプション設定がありますか?
  3. cmsJava7並列コレクターなどの他のコレクターに変更が加えられましたか?
  4. Java 7のガベージコレクションに関する優れたドキュメントはどこにありますか?

6
G1ガベージコレクター入門では、ベストプラクティスの概要も説明されています。
ジョンマッカーシー2013年

回答:


47

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.

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


2
これは、OSXの1.7.0_09でも引き続き有効です
Age Mooij 2012年

1
Linuxの1.7.0_10でも同じ
Marc Polizzi

OracleWebサイトから直接フェッチされたlinux / amd64上のOracleJDK7u17には当てはまりません。それは言う-XX:+UseParallelGC
user1050755 2013年

31

オラクルはついに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です。


1
サーバーは2コアと2GBRAM以上で定義されます。詳細を経由して見つけることができますhg.openjdk.java.net/jdk7u/jdk7u/hotspot/file/0d82bf449a61/src -ファイル./share/tools/launcher/java.cと./share/vm/runtime/を見てos.cpp
user1050755

22

はい、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の内部を理解するのに非常に役立つことがわかりました。

さらに詳しい情報はこちら


6
私はこれらのリソースを見てきました。しかし、最初の記事は、まだ実験的なオプションであったJDK6のG1に関するものです。他の記事は、JDK7および少なくとも1年前のベータリリースに関するものです。OracleまたはJDKチームからの最新情報または公式ドキュメントを探しています。
Florakel 2011年

13

1.G1はJava7のデフォルトのコレクターですか(...)

このJava5ページのルールは、Java 7(およびAFAIK、Java 8)にも引き続き適用されます。

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

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

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

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

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

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

Java 7以降、単純に-XX:+UseG1GC。おそらくまた興味深いのは次のことをしたいときです。

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

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

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

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

G1固有のオプションはここにリストされています

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

わからないけど...

G1は、コンカレントマークスイープコレクター(CMS)の長期的な代替品として計画されています。

4. Java 7のガベージコレクションに関する優れたドキュメントはどこにありますか?

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

http://www.oracle.com/technetwork/java/javase/tech/index-jsp-140228.html

ある程度の深い読みが必要ですが、調整が必要な場合は時間の価値があります。特に洞察に満ちているのは:ガベージコレクターの人間工学


13
  1. G1はJava7のデフォルトのコレクターですか?そうでない場合、G1をアクティブ化するにはどうすればよいですか?

G1は-XX:+UseG1GCJava7のデフォルトのコレクターではありません。G1GCが有効になります。

  1. 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パラメータを再構成しましたが、上記のドキュメントページに従う場合は必要ありません。特にParallelGCThreadsConcGCThreadsについては、上記の推奨事項と照合してください。これらはCPUコアに基づいています。不要なパラメータの再構成を削除します。

オラクルからの推奨事項

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

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

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

  1. cmsやJava7の並列コレクターなどの他のコレクターに変更が加えられましたか?

Java7にはいくつかの変更があります。この記事をご覧ください

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

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

本番環境でのJavaG1ガベージコレクション


3

jdk1.7.0_02ではG1はデフォルトのガベージコレクタではありません。デフォルトのガベージコレクターは、マシンのクラスによって異なります。マシンがサーバークラスの場合、デフォルトのガベージコレクターはスループットコレクターです。マシンがクライアントクラスの場合、デフォルトのガベージコレクターはシリアルコレクターです。


1
私はこれが完全に正しいことに異議を唱えます。Java 5リファレンス、まだ有効です。Windowsシステム(32/64)の場合:デフォルトでJava 32ビット(5..8)>>シリアルGCを実行します。デフォルトでは、Java 64ビット(5..6)>> ParallelGC(若い世代のみ)を実行します。デフォルトでは、Java 64ビット(7..8)>> ParallelOldGC(ヤングとオールドの並列)を実行します。Java 7の変更のリファレンス、最終的に「並列」コレクター==「スループット」コレクター」
Luke Usherwood 2013

3
(この人の最初の、そして正確な、SOの貢献に対する厳しい反応。私はそれが彼らの最後でもあることに注意します。)
Luke Usherwood 2013

2

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


0

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.