私は自分のプロジェクトの1つでJava 8(Oracle JVM)を使ってG1GCを試してきました。私のGCフラグは効果的です:小さなメモリフットプリントでG1GCを調整するにはどうすればよいですか?
-Xms64m
-Xmx1024m
-XX:+UseG1GC
-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails
-Xloggc:/tmp/gc.log
-XX:+PrintAdaptiveSizePolicy
私はヒープが私が持っているライブデータの量よりもはるかに大きくなることがわかります。 GCログには、私は根本的な原因と思われるものを示しています。
[G1Ergonomics (Heap Sizing) attempt heap expansion, reason: recent GC overhead higher than threshold after GC, recent GC overhead: 10.17 %, threshold: 10.00 %, uncommitted: 811597824 bytes, calculated expansion amount: 162319564 bytes (20.00 %)]
が効果的に私のアプリケーションは、ごみの多くを生成している、ので、GCに費やされる時間の割合が10%以上である、とそうG1の人間工学が増加しますヒープサイズ。パラレルコレクタに
このしきい値は-XX:GCTimeRatio
(スループット目標)を用いて調整することができるが、私はdocsで見ることができるものからG1には同等のフラグが存在しません。
パラレルコレクタの場合、Java SEはアプリケーションの特定の動作を達成することに基づく2つのガベージコレクションチューニングパラメータを提供します。最大停止時間目標とアプリケーションスループット目標。パラレルコレクタのセクションを参照してください。これらの2つのオプションは、他のコレクタでは使用できません。これらの動作は、必ずしも満たされるとは限りません。
私の質問は、最大ヒープサイズを下げることとは別に、より小さなメモリフットプリントでG1GCを調整する方法はありますか?
ログには、最大休止時間の目標を超えているという証拠はなく、実際にはそれを上げても問題は解決されません。 Which JVM Flag sets the GC overhead threshold mentioned in the G1Ergonomics log?、しかしそこには、間違った答えが受け入れられているように見えます:
これはおそらく、この質問のデュープです。 (あるいは、古いバージョンのJVMだけが正しいかもしれません)。
を収集するために持っているので、休止時間の目標をリラックス?それでも最大のヒープサイズを尊重しますか? – rogerdpack
数ドルのハードウェアを節約するのに費やす時間はそれほど価値がないかもしれません。 1 GBのメモリを節約することはどれくらい重要ですか? –
@Peterもちろん、それは財政的に価値がありません。私たちがそのように興味を持っている場合、私たちの技術がどのように機能するかを知ることを妨げてはなりません。 – pauldoo