2016-04-15 24 views
5

ガーベッジコレクタがG1で、同時マークオーバーフローが発生することがありました。一度、同時マーク・リセット・オーバーフローがある場合、このオーバフローは、次の並行マーク・フェーズで継続する。同時のマークがもはや機能していないように見えるので、最終的に完全なGCにつながります。JavaガベージコレクタでG1ガベージコレクタを使用すると不要なフルGCが発生しますか?

同じデータトラフィックで同じApache Stormベースのアプリケーションを実行する4台のマシンがあります。マシンの1台だけがこの経験を1週間に1回持っています。

は、バグに関連する本です:上記のページからの提案によるとhttps://bugs.openjdk.java.net/browse/JDK-8065402

を「G1がマークスタックオーバーフローがマーキング同時中に発生したときにスタックをマーキング展開しません」、我々は4からの同時マークスレッドを倍増しました8、ヒープサイズは8GBから16GBです。しかし、完全なGCがまだ発生し、唯一の違いは発生が遅れていることです。

他の提案はありますか?オラクルg1_gcブログから

Java HotSpot(TM) 64-Bit Server VM (25.65-b01) for linux-amd64 JRE(1.8.0_65b17), 
built on Oct 6 2015 17:16:12 by "java_re" with gcc 4.3.0 20080428 (Red Hat 4.3.0-8) 
Memory: 4k page, physical 529167668k(69283408k free), swap 33554424k(33552380k free) 
CommandLine flags: -XX:ConcGCThreads=8 -XX:G1ReservePercent=20 -XX:GCLogFileSize=104857600 
-XX:InitialHeapSize=17179869184 -XX:InitiatingHeapOccupancyPercent=45 -XX:MaxGCPauseMillis=100 
-XX:MaxHeapSize=17179869184 -XX:NumberOfGCLogFiles=10 -XX:ParallelGCThreads=30 
-XX:+PrintAdaptiveSizePolicy -XX:PrintFLSStatistics=2 -XX:+PrintGC -XX:+PrintGCApplicationStoppedTime 
-XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC 
-XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseG1GC -XX:+UseGCLogFileRotation 
... 
... 
2016-04-13T22:06:37.254-0400: 19839.175: [GC concurrent-root-region-scan-start] 
2016-04-13T22:06:37.313-0400: 19839.234: [GC concurrent-root-region-scan-end, 0.0592966 secs] 
2016-04-13T22:06:37.313-0400: 19839.234: [GC concurrent-mark-start] 
2016-04-13T22:06:38.569-0400: 19840.490: [GC concurrent-mark-reset-for-overflow] 
... 
2016-04-13T22:06:42.810-0400: 19844.731: [GC concurrent-mark-reset-for-overflow] 
... 
2016-04-13T22:11:19.253-0400: 20121.175: [GC concurrent-mark-reset-for-overflow] 
... 
... 
... 
2016-04-14T01:58:17.254-0400: 33739.176: [GC concurrent-mark-reset-for-overflow] 
... 
2016-04-14T01:58:36.957-0400: 33758.878: [Full GC (Allocation Failure) 
+1

この記事をチェックしてください:https://blogs.oracle.com/poonam/entry/understanding_g1_gc_logs:3.198:[GC同時マーク・オーバーフロー・オーバーフローのため] これは、グローバル・マーキング・スタックが満杯になったことを示します。スタックのオーバーフローでした。このオーバーフローが検出され、マーキングを再度開始するためにデータ構造をリセットする必要がありました –

答えて

7

GC concurrent-mark-reset-for-overflow

はここGCログです。これは、世界的なマーキングスタックが満杯になっていたし、スタックのオーバーフローがあったことを示しています。並行マーキングがこのオーバーフローを検出し、マーキングを再度開始するためにデータ構造をリセットしなければならなかった

したがって、-XX:MarkStackSizeを増やすことはすぐに勝利です。あなたのVMパラメータから

少数の観察:

  1. G1 GCはそれを変更することなく効率的に作業できるようになり、デフォルトで適応ガベージコレクタです。 G1GC
  2. のキー・パラメータ:-XX:MaxGCPauseMillis, -XX:G1HeapRegionSize,-XX:ParallelGCThreads=n, -XX:ConcGCThreads=n には、oracleのドキュメントpageを簡単に見てください。その他はすべてデフォルト値のままにしておきます。
  3. ヒープサイズが16 GBの場合、理想的な領域サイズは8 MBである必要があります。 2048地域が維持されていることを確認してください。
  4. 一時停止時間の目標を再確認してください。 -XX:MaxGCPauseMillis200msが16 GBヒープで非現実的な場合は、この値を適切に設定します。
  5. XX:ParallelGCThreads=n, -XX:ConcGCThreads=nは、マシンのコア数に応じて設定することを推奨しています。

    -XX:ParallelGCThreads=n:STWワーカースレッドの値を設定します。 nの値を論理プロセッサの数に設定します。 nの値は、8までの論理プロセッサーの数と同じです。

    -XX:ConcGCThreads=n:並列マーキングスレッドの数を設定します。並列ガベージコレクションスレッド(ParallelGCThreads)の数の約1/4にnを設定します。

  6. 再訪-XX:InitialHeapSize=17179869184 -XX:InitiatingHeapOccupancyPercent=45 -XX:G1ReservePercent=20パラメータ。それらを変更する必要がある場合を除き、デフォルト値のままにしておきます。

G1GCログの理解を深めるためにこのページをご覧ください。

+0

4つのマシンのいずれかで、同時マーク再設定のオーバーフローを繰り返した後の完全なGC(問題と同じ問題)新しい追加設定は-XX:MarkStackSize = 16Mです。さらに-XX:MarkStackSizeを増やしても問題が解決される場合は、アップデートを行います。 – Jeff

+0

@Jeffどうして結局これを解決しましたか? – IceMan

関連する問題