Javaチューニング(性能改善)
- Javaのメモリ空間のイメージについて [2016-07-14] new
- FullGCの抑制とそれによる影響について [2016-07-14] new メモリ構造の復習とチューニング対象について
Javaのメモリ空間のイメージについて
Javaのメモリ(Serial Collector, Parallel Collector 方式)空間のイメージ
※Nativeメモリ領域は、Cヒープ、スレッドスタック
Javaのメモリ(G1GC方式)空間のイメージ
※Nativeメモリ領域は、Metaspace領域、Cヒープ、スレッドスタック ※Permanent領域が無くなっている
FullGCの抑制とそれによる影響について
FullGCを抑制するには、例えば以下のパラメータを設定する。
- -XX:+UseParallelOldGC
- -XX:NewRatio=1
- -XX:SurvivorRatio=2
- -XX:TargetSurvivorRatio=100
- -XX:-UseAdaptiveSizePolicy
GCの種類とシステム停止時間については「GCの種類と方式について」メモを参照。
Full GCを起こさないようにチューニングした際のメリデメですが、自分が思いつくのは以下。
- メリット(2点)
-
- 止まることが許されないクリティカルなシステムで使用できる
- 「長時間の Stop the World(システム停止時間)」の頻度を下げることでの性能改善
- デメリット(3点)
-
- メモリリークが発生しやすい(FullGCで回収対象となるオブジェクトが残る)
- Scavenge GCの実行回数が増え、実行時間も長くなり、性能劣化を招く
- 実装アプリケーション以外の問題が起きやすい(Java自体やJava使用製品など)
「システムが止まることが許されないシステムで使用できる」と言っても
Scavenge GC も、システム停止は発生しているし、FullGCを抑えた場合、こちらの回数が増えたり、時間が長くなったりする場合が多い。
特に、FullGCが起きていた時には出なかった問題が、結構な頻度で出る(Java自体のバグ(RMIのメモリリークなど)や、Javaを使用した製品のバグ(これも大体はメモリリークやNativeな実装問題))
例えば、ちゃんとリソースを閉じなければ、Full GCされるまで残るし、
また、Nativeな重い処理をガンガンやっている場合、GC時に排他がかかり(Native処理の完了までGCがロックされる)JVMフリーズの原因となったりする。
なので、FullGCを抑制した際のデメリットも馬鹿にできない(現にハマりました)。