1

現在、高スループット フローで動作するように Apache NiFi を調整しようとしていますが、フル GC を避けることはできません。

フローが開始されると、非常に迅速な若い GC が発生しますが、最終的にフル GC がトリガーされるまで、割り当て要求に対応できません。この状況は、さまざまなヒープ サイズ (8 GB から 50 GB) と基本的な構成 (オラクルのドキュメントに従って領域サイズと指定されたスレッドのみが構成されている) で発生します。

-XX:ConcGCThreads=3
-XX:G1HeapRegionSize=16
-XX:InitialHeapSize=34359738368
-XX:MaxHeapSize=34359738368
-XX:ParallelGCThreads=10
-XX:+ParallelRefProcEnabled
-XX:+PrintAdaptiveSizePolicy
-XX:+PrintGC
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+UnlockExperimentalVMOptions
-XX:+UseG1GC

以下は、GCViewer を使用して実行された GC ダンプ分析です。

ここに画像の説明を入力

ログを見ると、混合 GC 用に選択された古いリージョンの数が常にゼロであることがわかりました。この非常に役立つ記事によると、 InitiatingHeapOccupancyPercentをドロップして、マーキングフェーズをより早く開始できるようにすることができます。選択された古い領域の数がゼロのままであることを考えると、これは何の効果もないようです。

[G1Ergonomics (CSet Construction) finish choosing CSet, eden: 1777 regions, survivors: 251 regions, old: 0 regions, predicted pause time: 216.28 ms, target pause time: 200.00 ms]

オラクルのドキュメントによると、G1MixedGCLiveThresholdPercent=65など、使用できる実験的なフラグがありますが、他のすべての前にUnlockExperimentalVMOptionsフラグを追加しても、次のエラーが発生します。

2016-10-10 14:48:14,285 ERROR [NiFi logging handler] org.apache.nifi.StdErr Error: VM option 'G1MixedGCLiveThresholdPercent' is experimental and must be enabled via -XX:+UnlockExperimentalVMOptions

基本的に、フラグは無視されます。

最初の例では、完全な GC をトリガーするのは、古いリージョンの非コレクションでしょうか? もしそうなら、どうすれば古いリージョンを収集し、アプリケーションのニーズに十分なメモリを解放できますか?

ご協力ありがとうございました。

4

0 に答える 0