JVMオプション
- GCの種類と方式について [2013-08-23]
- GCとメモリ情報の出力 [2013-07-10]
- HotSpot関連 [2013-01-31]
- チューニング(性能改善)関連 [2016-07-14] new
- GC overhead limit exceeded [2013-01-31]
-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の回数、総時間、平均時間を出力する |
*2.一般的には、「-verbose:gc」もしくは「-Xloggc:filename」と「-XX:+PrintGCDetails」等の組み合わせが多いようだ。
HotSpot
Javaは、JIT(Just In Time)コンパイラを採用しており、以下の実行段階を踏む。
- javacにてバイトコードに変換(.class)
- バイトコードを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に時間が掛かりすぎても処理が中断されない。 |