Java仮想マシン(JVM)とは
Javaバイトコードとして定義された命令セットを実行する仮想マシン.
JVM系言語
📝JVM:メモリ管理
基礎を抑えないとトラブルシューティングで応用できない.
- Native: JVMの領域
- MetaSpace: クラスやメソッド.
- Cヒープ: JVM自信のリソース管理.
- スレッドスタック
- Heap: Java プログラムの領域
- Young(New)
- Eden: new演算子で生成されたJava Objectが格納される領域.
- Survivor: GC実行時に破棄されなかったJava Objectが格納される領域.
- From
- To
- Old
- Young(New)
📝JVM:OutOfMemoryError(OOME)
メモリ枯渇. ここではJVMにおけるノウハウをまとめる.
- OOME発生時のヒープダンプを吐く設定をJVM起動オプションでつける.
- -XX:+HeapDumpOnOutOfMemoryError
- topコマンドでjavaプログラム全体のメモリ使用量を表示(RESの部分).
- jstatコマンドでヒープの内容表示.
ref. OutOfMemoryError の調べ方 - Qiita
📝JVM:ガベージコレクション
JVMの📝ガベージコレクションまとめ.
JVMのヒープ領域に存在する使われてないオブジェクトを自動削除.
HotSpot VM
- シリアルGC
- パラレルGC
- CMS
- G1GC
📍JVM起動オプション
HotSpot JVM optionsについてまとめ.
OpenJDKとOracleJavaは微妙に違うかもしれないので検索された記事は注意する.
デフォルト値確認
以下で確認.
$ java -XX:+PrintFlagsFinal
以下はJVMから見えるシステムの設定.
$ java -XshowSettings:system -version
ヒープメモリ設定
- -Xms: ヒープ最小値
- -Xmx: ヒープ最大値
- -XX:+HeapDumpOnOutOfMemoryError
- OutObMememoryErrorが発生したときにDumpFileに出力.
ヒープサイズを指定しない場合は以下のルールで決まる. Mはシステムのメモリ.
- M ≤ 248m => M/2
- 248m < M ≤ 496m; => 124m
- 496m < M => M/4
ガベージコレクションログ設定
- -Xlog:gc:
- 簡易ログ
- -Xlog:gc*::time
- 詳細ログ.
- GC実行ログをファイルに書き出す
- timeつき.
ガベージコレクション種別
- -XX:+UseSerialGC
- シリアルGC.
- -XX:+UseParallelGC
- パラレルGC, マルチコア用.
- -XX:+UseG1GC
- G1GC.
- -XX:+UnlockExperimentalVMOptions -XX:+UseZGC
- 低レイテンシ用GC. GCの時間か限りなく短い.
ネイティブメモリトラッキング(NMT)
- -XX:NativeMemoryTracking=detail
- jcmd $pid VM.native_memroyでheap以外のメモリを表示.
References
JVMプロフェイリングtools
Java VisualVM
JavaのCPUやメモリ使用率をアプリ単位で確認できるツール.
Eclipse Memory Analizer(MAT)
ヒープダンプの解析ならそれに特化したEclipse Memory Analizer(MAT)もよい. Eclipseをインストールしなくても単体のスタンドアローンツールとして使える.
被疑箇所を分析してレポート表示してくれるLeak Suspects機能が便利.
Topics
🔧GraalVM
JVMをコンパイルして実行するVM. Javaなのにコンパイルできるw.
JVMの課題は起動速度やメモリ使用量が大きくてスクリプト用途には不向きだった. それを解決する.
📝Zing JVM
GCによるいわゆる “stop-the-world pause”がないという, 驚きのGCアルゴリズム(C4)が話題のJVM.
- Why we chose Java for our High-Frequency Trading application | by Jad Sarmo | Medium
- Tricks of the Trade: Tuning JVM Memory for Large-scale Services | Uber Blog
- LMAXがAzulのZing JVMを使ってレイテンシを50%改善
- Clojure on Azul Zing JVM