JVMオプションの確認方法


標準オプション

-help または -? で標準オプションが確認できる。

$ java -help
使用方法: java [-options] class [args...]
           (クラスを実行する場合)
   または  java [-options] -jar jarfile [args...]
           (jarファイルを実行する場合)
optionsには次のものがあります。
    -d32      使用可能な場合は32ビットのデータ・モデルを使用する
    -d64      使用可能な場合は64ビットのデータ・モデルを使用する
    -server   "server" VMを選択する場合
   ・・・

非標準オプション

-X とすると非標準のオプションが確認できる。

$ java -X
    -Xmixed           混合モードの実行(デフォルト)
    -Xint             インタプリタ・モードの実行のみ
    -Xbootclasspath:<:で区切られたディレクトリおよびzip/jarファイル>
                      ブートストラップのクラスとリソースの検索パスを設定する
    -Xnoclassgc       クラスのガベージ・コレクションを無効にする
    -Xincgc           増分ガベージ・コレクションを有効にする
    -Xloggc:<file>    タイムスタンプが付いたファイルにGCステータスのログを記録する
    -Xbatch           バックグラウンドのコンパイルを無効にする
    -Xms<size>        Javaの初期ヒープ・サイズを設定する
    -Xmx<size>        Javaの最大ヒープ・サイズを設定する
   ・・・

オプションのカテゴリと設定

  • -server のような X が付かないものは標準オプション
  • -X で始まるものは非標準オプションで、全てのVM実装で有効とは限らなく、変更される可能性もある
  • -XX で始まるものは非安定オプションで、予告なく変更される可能性がある

ON/OFF を切り替えるようなbool値のオプションは -XX:+<オプション> でオン、-XX:-<オプション> でオフのように指定する。例えば -XX:+PrintGCDetails のように。

値を設定するオプションの場合は -XX:<オプション>=<値> のように指定する。例えば -XX:MaxPermSize=256m のように。

jcmd によるオプションの確認

稼働中の特定のプロセスに対して、直接コマンドラインから指定されたオプションを確認するには以下のようにする。

$ jcmd <プロセスID> VM.command_line

java 起動時のコマンドライン引数の値が表示される。

<プロセスID>:
VM Arguments:
jvm_args: -Dfile.encoding=UTF-8 -XX:+UseConcMarkSweepGC ・・・
java_command: <unknown>
java_class_path (initial): ・・・
Launcher Type: generic


コマンドライン引数で指定されたものに加え、JVMがプラットフォームに応じて自動的に設定したチューニングフラグを合わせて確認するには以下のようにする。

$ jcmd <プロセスID> VM.flags

プラットフォームに応じて自動設定されたチューニングフラグの設定も表示される。

<プロセスID>:
-XX:CICompilerCount=3 -XX:+HeapDumpOnOutOfMemoryError -XX:InitialHeapSize=134217728 ・・・

例えば CICompilerCount はコンパイラタイプとCPU数に応じて自動設定されたもの。


デフォルト値を含めて、全てのチューニングフラグを表示するには -all オプションを付ける。

$ jcmd <プロセスID> VM.flags -all

つらつらと数百個表示される。

<プロセスID>:
[Global flags]
    uintx AdaptiveSizeDecrementScaleFactor          = 4                       {product}
    uintx AdaptiveSizeMajorGCDecayTimeScale         = 10                      {product}
    uintx AdaptiveSizePausePolicy                   = 0                       {product}
    uintx AdaptiveSizePolicyCollectionCostMargin    = 50                      {product}
    uintx AdaptiveSizePolicyInitializingSteps       = 20                      {product}
    ・・・

プラットフォーム固有のデフォルトチューニングフラグ

プラットフォーム固有のデフォルトのチューニングフラグを表示するには以下のようにする。

$ java -XX:+PrintFlagsFinal -version

診断用フラグ、実験的フラグ、商用機能フラグなど全部入りで表示するには以下のようにする。

$ java -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UnlockCommercialFeatures -XX:+PrintFlagsFinal -version


結果は大量に以下のように表示される。

[Global flags]
    uintx AdaptiveSizeDecrementScaleFactor          = 4                   {product}
    uintx AdaptiveSizeMajorGCDecayTimeScale         = 10                  {product}
    uintx AdaptiveSizePausePolicy                   = 0                   {product}
    uintx AdaptiveSizePolicyCollectionCostMargin    = 50                  {product}
    uintx AdaptiveSizePolicyInitializingSteps       = 20                  {product}
    ・・・
    uintx InitialCodeCacheSize                      = 2555904             {pd product}
    uintx InitialHeapSize                          := 134217728           {product}
    uintx InitialRAMFraction                        = 64                  {product}
    uintx InitialSurvivorRatio                      = 8                   {product}
    uintx MaxHeapFreeRatio                          = 100                 {manageable}
     intx FenceInstruction                          = 0                   {ARCH product}
     bool IncrementalInline                         = true                {C2 product}
     intx InteriorEntryAlignment                    = 16                  {C2 pd product}
     bool LIRFillDelaySlots                         = false               {C1 pd product}
    bool PrintHeapAtGCExtended                      = false               {product rw}
     bool UseCompressedClassPointers                := true               {lp64_product}
     bool UseCompressedOops                         := true               {lp64_product}

:= はデフォルト値以外のプラットフォームに応じた値が設定されていることを示す。

コロンがない場合は対象のバージョンのJVMのデフォルト値。


右端のキーワードは以下の意味となる。

説明
product 一般的なフラグでオフィシャルサポートがある
product rw 書き込み可能な内部フラグ
manageable 書き込み可能な外部フラグ
C1 Client JIT Compiler 固有のフラグ
C2 Server JIT Compiler 固有のフラグ
pd プラットフォーム依存のフラグ
lp64 64bit JVMに固有のフラグ
ARCH CPUアーキテクチャに依存したフラグ
diagnostic JVMデバッグ用の診断用 -XX:+UnlockDiagnosticVMOptions にて出力される
experimental 実験的機能 -XX:+UnlockExperimentalVMOptions にて出力される
commercial 商用機能で利用にはライセンスが必要 -XX:+UnlockCommercialFeatures にて出力される

{pd product} はデフォルト値がプラットフォーム毎で異なるもの

{product} は全てのプラットフォームで共通のデフォルト値

{manageable} はjinfoコマンドなどにより実行時にフラグの値を変更可能

といった感じ。

-XX:+PrintFlagsInitial により、そもそもの初期値を表示することもできる。

プラットフォーム別のコンパイラ指定

-client-server のオプション指定で、どのコンパイラ(通称 C1 / C2 コンパイラ)になるかは以下。

PF JVM -client -server -d64
Linux 32bit VM 32bit クライアントコンパイラ 32bit サーバコンパイラ エラー
Linux 64bit VM 64bit サーバコンパイラ 64bit サーバコンパイラ 64bit サーバコンパイラ
OS X 64bit VM 64bit サーバコンパイラ 64bit サーバコンパイラ 64bit サーバコンパイラ
Windows 32bit VM 32bit クライアントコンパイラ 32bit サーバコンパイラ エラー
Windows 64bit VM 64bit サーバコンパイラ 64bit サーバコンパイラ 64bit サーバコンパイラ

オプション指定しない場合は以下のようにデフォルト設定される。

PF JVM CPU
Linux 32bit VM 1CPU -client
Linux 32bit VM 2CPU~ -server
Linux 64bit VM 任意 -server
OS X 64bit VM 任意 -server
Windows 32bit VM 任意 -client
Windows 64bit VM 任意 -server

なお、Java8 からは、-server とともに指定できる-XX:+TieredCompilation による階層的コンパイルがデフォルトで有効となっている。

主要なオプション

については長くなりそうなので次回。