TOP > 技術メモ > Java > JVMオプション

JVMオプション

-XXオプションについて、有効は「+」、無効は「-」と指定する。
自分がどのVMで起動しているか確認する場合は「java -version」コマンド。
Java VMのデフォルト値はJava HotSpot VM Optionsを参考に。

また、JVM は「クライアントVM」か「サーバVM」かを実行時に指定できる。
上記は指定しなかった場合、OSによってデフォルト値が異なるので、デフォルト値がどうなっているかは以下を参照する。
サーバークラスマシンの検出

GCの種類と方式について

JVMでは、「Scavenge GC(マイナーGC)」と「Full GC(メジャーGC)」の2種類のガベージ・コレクションが行われる。
上記の GC では Stop the world (システム停止) が発生する。
特に Full GC では「マーク&スイープ処理」が行われるため、Scavenge GC に比べて時間が掛かる。
そのため、「Stop the World(システムが停止しているかのような)」事象が発生する。
※Scavenge GC も処理(停止)時間が短いだけであって「Stop the World (システム停止)」が起こっているので注意

大きく分けて、GCには以下の方式がある。

  • Serial Collector 方式 Scavenge GC と Full GC をシングルスレッドで行う方式
  • Parallel Collector 方式 Scavenge GC をマルチスレッド。Full GC をシングルスレッドで行う方式
  • Parallel Compacting Collector 方式 Scavenge GC と Full GC をマルチスレッドで行う方式
  • Concurrent Mark-Sweep Collector 方式 Full GC のマーク&スイープ処理の大半をアプリケーションスレッドと並行して行う方式
  • G1 GC 方式 (「Java SE 7 Update 4」から追加された) Javaヒープを細かく細分化し、New領域やOld領域などを割り当てる方式
オプション 説明
-XX:+UseConcMarkSweepGC
(Concurrent Mark-Sweep Collector方式)
New世代領域は-XX:+UseParallelGCと同様の処理。
Old領域でコンカレントGCを実行する。
コンカレントGCは、アプリケーションスレッドと並列してGCを行うことで、システム停止時間を減らすのが目的。
また、コンパクション(メモリのデフラグ)を行わないため、メモリ不足となる場合は、Full GCが発生する。
*但しこれを設定すると以下の値が自動設定となるので注意。
-XX:SurvivorRatio=1024
-XX:MaxTenuringThreshold=0
-XX:+UseConcMarkSweepGC
-XX:+CMSIncrementalMode
(Concurrent Mark-Sweep Collector方式)
-XX:+UseConcMarkSweepGCをインクリメンタル・モードで実行。
一度に全てのメモリを掃除せず、細かい単位で掃除させることで停止時間を小さくすることが目的。
-XX:+UseSerialGC
(Serial Collector方式)
New領域、Old領域ともに、GCをシングルスレッドで実行する。
*CPUが1の場合はデフォルトがこれ
-XX:+UseParallelGC
(または -XX:+UseParNewGC )
(Parallel Collector方式)
New領域では、GCをマルチスレッドで実行する。
Old領域が不足したら、Full GCをシングルスレッドで実行する。
「サーバーVM」ではこれがデフォルト(参考:ガベージコレクタのエルゴノミクス
(CPUが1つの場合は「-XX:+UseSerialGC」がデフォルト)
また「GC overhead limit exceeded」が発生しやすく?なる。
*但しこれを設定すると以下の値が自動設定となるので注意。
-XX:+UseAdaptiveSizePolicy
*「-XX:+UseConcMarkSweepGC」と併用する場合は「-XX:+UseParNewGC」を指定する
-XX:+UseParallelGC
-XX:+UseParallelOldGC
(Parallel Compacting Collector方式)
New領域は、GCをマルチスレッドで実行する。
Old領域が不足したら、Full GCをマルチスレッドで実行する。
-XX:+UseG1GC
(G1 GC方式)
Java 7新機能の「G1 GC」を実行する。
Javaヒープを細かく細分化し、New領域やOld領域などを割り当てる方式。
詳細は、上の「Getting Started with the G1 Garbage Collector」を参照。
*Java SE 6(Update 14)でも実はリリースされており、その場合は以下引数を指定する
-XX:+UnlockExperimentalVMOptions(これを先に指定しないと動かない)
-XX:+UseG1GC
詳細はGetting Started with the G1 Garbage Collector
→日本語訳:「Sipadan2003」さんから

GCとメモリ情報の出力

オプション 説明
-verbose:gc 一般的なGC情報を出力する
・HP-UXの場合は以下を推奨(HPJmeterでJavaVM引数やGCログ詳細が解析できる)
-Xverbosegc:file=[ファイル名]
-Xloggc:[ファイル名] GCの出力情報をファイル[ファイル名]に保存する
-XX:+PrintGCDetails New領域、Old領域の詳細情報を出力する
-XX:+PrintTenuringDistribution オブジェクトの寿命の情報する
-XX:+PrintHeapAtGC GC前後のヒープ領域の情報する
-XX:+TraceGen0Time New領域のGCの回数、総時間、平均時間を出力する
-XX:+TraceGen1Time Old領域のGCの回数、総時間、平均時間を出力する
*1.Java 1.3.*では上記の内、「-verbose:gc」しか使用できない。
*2.一般的には、「-verbose:gc」もしくは「-Xloggc:filename」と「-XX:+PrintGCDetails」等の組み合わせが多いようだ。

HotSpot

Javaは、JIT(Just In Time)コンパイラを採用しており、以下の実行段階を踏む。

  1. javacにてバイトコードに変換(.class)
  2. バイトコードをJVMがインタプリタで実行(実行回数が一定を超えると動的コンパイル)

インタプリタ実行が一定回数を超える(HotSpot)ことで動的コンパイルが行われる。
動的コンパイルが行われた後は、実行速度が上がる(インタプリタ実行ではないため)。
上記に着目して、性能改善を図ることができる。

オプション 説明
-client クライアント用VMを起動
-server サーバ用VMを起動
-XX:+PrintCompilation 動的コンパイルしたメソッドを表示する
-XX:+CITime (1.4のみ) 動的コンパイルに要した時間などの情報を表示する
-XX:+LogCompilation hotspot.logに動的コンパイル時のログを出力する
-XX:CompileThreshold=10000 各メソッドはここで指定された回数だけインタプリタで実行され、この回数を超えると動的コンパイルされる
*値を小さくしすぎてもパフォーマンスが悪くなる可能性があるようだ(設定値の都度、動的コンパイルが行われるため)
-XX:+OnStackReplacement On stack replacementを有効にする
-Xbatch 動的コンパイルをバックグラウンドで行わない
-Xint 動的コンパイルを行わない(インタプリタのみを使用する)

チューニング(性能改善)関連

Javaのメモリ構造(世代別)については「Javaチューニング(性能改善) | Java」を参照

オプション 説明
-Xms ヒープ領域(New領域+Old領域)の初期値
例) -Xms512m
-Xmx ヒープ領域(New領域+Old領域)の最大値
例) -Xmx1024m
-XX:PermSize Permanent領域の初期値(G1GC方式ではこのパラメータは無効)
MaxPermSizeと同じに設定することが推奨されている
例) -XX:PermSize=256m
-XX:MaxPermSize Permanent領域の最大値(G1GC方式ではこのパラメータは無効)
例) -XX:MaxPermSize=256m
-XX:MetaspaceSize Metaspace領域の初期値(G1GC方式からの設定値)
MaxMetaspaceSizeと同じに設定することが推奨されている
例) -XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize Metaspace領域の最大値(G1GC方式からの設定値)
例) -XX:MaxMetaspaceSize=256m
-XX:NewRatio New領域 と Old領域 の比率
例) -XX:NewRatio=2
New領域 : Old領域 = 1 : 2
-XX:SurvivorRatio New領域 と Old領域 の比率
例) -XX:SurvivorRatio=8
Eden領域 : From領域 : To領域 = 8 : 1 : 1
-XX:TargetSurvivorRatio Survivor領域で利用可能なスペースの比率。
超えた場合にFullGCが発生する。
例) -XX:TargetSurvivorRatio=50
-XX:-UseAdaptiveSizePolicy Survivior領域のサイズはGCの都度、自動調整されてしまうため、それを無効にする。
Surviror領域を意図した比率で保ちたい場合に設定する。
例) -XX:-UseAdaptiveSizePolicy

GC overhead limit exceeded

オプション 説明
-XX:-UseGCOverheadLimit GC自体はメモリを自動解放するが、ヒープ領域が足りなくなったりするとスワップに入るためGCに時間がかかる。
そのため、「GC overhead limit exceeded」が頻発するらしい。
「UseGCOverheadLimit」オプションを無効にすることで、エラーを発生させずGCが行われるようになる。
ただし、上記を行うことでGCに時間が掛かりすぎても処理が中断されない。

▲ページの先頭へ