Java HotSpot VM Options

以下 Java HotSpot VM Options の勝手翻訳と、追加で原文には載っていないオプションについて。Oracle JDK 6 を対象とした内容となっています。

このドキュメントは Java HotSpot 仮想マシンのパフォーマンス特性に影響を与える一般的なコマンドラインオプションと環境変数に関する情報を提供します。特に断りのない限りこのドキュメントのすべての情報は Java HotSpot Client VMJava HotSpot Server VM の両方に適用されます。1.3.0 より古い JDKJava HotSpot VM を移植したいユーザは Java HotSpot Equivalents of Exact VM Flags を参照して下さい。

Java HotSpot VM オプションのカテゴリ

Java HotSpot VM が認識する標準オプションは Windows, Solaris, LinuxJava アプリケーション起動リファレンスページで詳述しています。このドキュメントでは Java HotSpot VM が認識する非標準オプションを扱っています。

  • -X で始まるオプションは非標準 (全ての VM 実装でのサポートが保証されていない) であり、今後の JDK リリースで予告なしに変更される場合があります。
  • -XX で記述しているオプションは安定版ではなく気軽な利用は推奨できません。これらのオプションは予告なく変更されることがあります。

いくつかの有用な -XX オプション

デフォルト値の一覧は Java SE 6 for Solaris SPARC の -server 説明にあります。一部のオプションはアーキテクチャ/OS/JVM バージョンごとに異なる可能性があります。異なるデフォルト値を持つプラットフォームは説明に記載しています。

  • ブール値のオプションは -XX:+<option> でオン、-XX:-<option> でオフとなります。
  • 数値オプションは -XX:<option>=<number> で指定できます。数値は 'm' または 'M' でメガバイト、'k' または 'K' でキロバイト、'g' または 'G' でギガバイトを含むことができます (例えば 32k は 32768 と等価)。
  • 文字列オプションは -XX:<option>=<string> で指定し、通常ファイルやパス、コマンドリストを指定します。

管理可能として記述されているフラグは JConsole と Java の管理インターフェース (com.sun.management.HotSpotDiagnosticMXBean API) を通じて動的に書き換え可能です。これは Monitoring and Managing Java SE 6 Platform Applications の図3に例示しています。また管理可能フラグは http://java.sun.com/javase/6/docs/technotes/tools/share/jinfo.html を通じても設定可能です。

以下のオプションは大まかに 3 つのカテゴリに分けています。

振る舞いオプション
オプションとデフォルト値 説明
-XX:-AllowUserSignalHandlers アプリケーションがシグナルハンドラをインストールする際に警告を出さない (Solaris, Linuxのみ)。
-XX:AltStackSize=16384 代替シグナルスタックのサイズ (kB単位) を設定 (Solarisのみ)(5.0で削除)
-XX:-DisableExplicitGC アプリケーションによる System.gc() コールを無効化。JVM は必要に応じて GC を実行する。
-XX:+FailOverToOldVerifier 新しい型チェッカーが失敗した時に古いベリファイアにフェールオーバーする (6で導入)。
-XX:+HandlePromotionFailure 最も Young 世代のコレクションが生存オブジェクトの完全な昇進の保証を必要としない (1.4.2 update 11 で導入) [5.0 及びそれ以前: false]
-XX:+MaxFDLimit ファイル記述子の最大数を増加 (Solarisのみ)。
-XX:PreBlockSpin=10 -XX:+UseSpinning で使用するカウント変数をスピン。オペレーティングシステムのスレッド同期コードに入る前に最大スピンイテレーションを制御できるようにする (1.4.2で導入)。
-XX:-RelaxAccessControlCheck ベリファイアによるアクセス制御チェックを緩和 (6で導入)。
-XX:+ScavengeBeforeFullGC Full GC の前に Young 世代 GC を実行する (1.4.1で導入)。
-XX:+UseAltSigs VM 内部シグナル SIGUSR1, SIGUSR2 の代わりに振替シグナルを使用する (1.3.1 update 9, 1.4.1で導入) (Solarisのみ)。
-XX:+UseBoundThreads カーネルスレッドにユーザレベルスレッドをバインドする (Solarisのみ)。
-XX:-UseConcMarkSweepGC Old 世代に対して concurrent mark-sweep GC を使用する (1.4.1で導入)
-XX:+UseGCOverheadLimit OutOfMemory エラーがスローされる前に GC に費やされている VM 時間の割合を制限するポリシーを使用する (6で導入)。
-XX:+UseLWPSynchronization スレッドベースの同期の代わりに Light Weight Process ベースの同期を使用する (1.4.0で導入) (Solarisのみ)。
-XX:-UseParallelGC Young GC のために並列 GC を使用する (1.4.1で導入)。
-XX:-UseParallelOldGC Full GC のために並列 GC を使用する。-XX:+UseParallelGC を設定にすると自動的に有効となる (5.0 update 6で導入)
-XX:-UseSerialGC 直列 GC を使用する (5.0で導入)。
-XX:-UseSpinning OS スレッド同期コードに入る前に Java モニタ上のネイティブスピンを有効にする (1.4.2と 5.0にのみ関連) [1.4.2マルチプロセッサ Windows:true]。
-XX:+UseTLAB スレッドローカルなオブジェクトの割り当てを行う (1.4.0より前に UseTLE と知られ 1.4.0 で導入) [1.4.2 またはそれ以前, x86 または -client: false]
-XX:+UseSplitVerifier StackMapTable 属性を持つ新しい型チェッカーを使用する (5.0で導入) [5.0:false]。
-XX:+UseThreadPriorities ネイティブスレッドの優先順位を使用する。
-XX:+UseVMInterruptibleIO OS_INTRPT に対して I/O 操作で EINTR を発生させる*1 (6で導入) (Solarisのみ)。
パフォーマンスオプション
オプションとデフォルト値 説明
XX:+AggressiveOpts 今後のリリースでデフォルトとなる予定のポイントパフォーマンスコンパイラ最適化をオンにします (5.0 update 6で導入)。
-XX:CompileThreshold=10000 コンパイルを行うまでのメソッド呼び出し/分岐の回数。 [-client: 1,500]
-XX:LargePageSizeInBytes=4M Java ヒープに対して使用されるラージページのサイズを設定 (14.0 update 1 で導入)。[AMD64: 2m]
-XX:MaxHeapFreeRatio=70 縮小を避けるための GC 後の空きヒープの最大パーセンテージ。
-XX:MaxNewSize=size New 世代の最大サイズ (バイト単位)。1.4 より MaxNewSize は NewRatio の関数として計算される [1.3.1 SPARC:32m; 1.3.1 x86:2.5m]
-XX:MaxPermSize=64M Permanent 世代のサイズ。[5.0 およびそれ以降:64bit VM は 30% より大きくスケール; 1.4 AMD64:96M; 1.3.1 -client:32M]
-XX:MinHeapFreeRatio=40 縮小を避けるための GC 後の空きヒープの最小パーセンテージ。
-XX:NewRatio=2 New/Old 世代サイズの比率。 [SPARC -client:8; x86 -server:8; x86 -client:12] -client:4 (1.3), 8(1.3.1+), x86:12]
-XX:NewSize=2.125m New 世代のデフォルトサイズ (バイト単位) [5.0およびそれ以降:64bit VM は 30% より大きくスケール; x86:1m; x86, 5.0およびそれ以前:640k]
-XX:ReservedCodeCacheSize=32M 予約コードキャッシュサイズ (バイト単位) - 最大コードキャッシュサイズ [Solaris 64bit, AMD64 および -server x86:48m; 1.5.0_06 とそれ以前, Solaris 64bit および AMD64:1024m]
-XX:SurvivorRatio=8 Eden/Survivor領域のサイズの比率 [Solaris AMD64:6; SPARC in 1.3.1:25; その他 Solaris プラットフォーム in 5.0 またはそれ以前:32]
-XX:TargetSurvivorRatio=50 Young GC 後に使用される Survivor 領域の望ましい割合。
-XX:ThreadStackSize=512 スレッドスタックサイズ (Kバイト単位)。(0はデフォルトスタックサイズを使用) [SPARC:512; Solaris x86:320 (5.0以前では 256); SPARC 64bit:1024; Linux AMD64:1024 (5.0以前は0); それ以外は0]
-XX:+UseBiasedLocking バイアスロックを有効にする。詳細についてはJava Tuning White Paper参照。(5.0 update 6 で導入) [5.0:false]
-XX:+UseFastAccessorMethods Get<Primitive>Field の最適化版を使用。
-XX:-UseISM 緊密共有メモリ (ISM) を使用する [Solaris以外のプラットフォームでは無効]。詳細は http://www.oracle.com/technetwork/java/ism-139376.html 参照。
-XX:+UseLargePages ラージページメモリを使用する (5.0 update 5 で導入)。詳細は Java Support for Large Memory Pages 参照。
-XX:+UseMPSS ヒープに対して w/4MB ページの複数ページサイズサポートを使用する。ISM の必要性を置き換えるためにこのオプションを使用しないで下さい (1.4.0 update 1 で導入, Solaris 9 以降が対象) [1.4.1 以前:false]
-XX:+UseStringCache 共通的に割り当てられた文字列のキャッシュを有効。
-XX:AllocatePrefetchLines=1 JIT コンパイルされたコードのプリフェッチ命令を使用して、最後のオブジェクト割り当て後にロードするためのキャッシュライン数。最後に割り当てられたオブジェクトが 1 インスタンスの場合のデフォルト値は 1、配列ならば 3。
-XX:AllocatePrefetchStyle=1 プリフェッチ命令に対して生成されたコードのスタイル。0 - どのようなプリフェッチ命令も生成されない、1 - それぞれの割り当て後にプリフェッチ命令を実行、2 - プリフェッチ命令が実行された時、ゲートに TLAB 割り当てウォーターマークポインターを使用する。
-XX:+UseCompressedStrings 純粋な ASCII として表現できる文字列に対して byte[] を使用する (Java 6 update 21 パフォーマンスリリースで導入)。
-XX:+OptimizeStringConcat 文字列連結操作を可能な限り最適化する (Java 6 Update 20 で導入)。
デバッグオプション
オプションとデフォルト値 説明
-XX:-CITime JIT コンパイラで費やされた時間を出力 (1.4.0で導入)
-XX:ErrorFile=./hs_err_pid<pid>.log エラーが発生した時にエラーデータを保存するファイル (6で導入)。
-XX:-ExtendedDTraceProbes パフォーマンスに影響を与える DTrace Probes in HotSpot VM を有効にする (6で導入, Solaris のみ)。
-XX:HeapDumpPath=./java_pid<pid>.hprof ヒープダンプのディレクトリまたはファイル名へのパス。管理可能 (1.4.2 update 12, 5.0 update 7 で導入)。
-XX:-HeapDumpOnOutOfMemoryError java.lang.OutOfMemoryErrorのがスローされたときにファイルにヒープをダンプする。管理可能 (1.4.2u12, 5.0u7で導入)。
-XX:onError="<cmd args>; <cmd args>" 致命的なエラーが発生した時にユーザー定義のコマンドを実行する (1.4.2u9で導入)。
-XX:OnOutOfMemoryError="<cmd args>; <cmd args>" 最初に OutOfMemoryError がスローされたときにユーザー定義のコマンドを実行する (1.4.2u12, 6 で導入)。
-XX:-PrintClassHistogram [CTRL]+[BREAK] キーでクラスインスタンスヒストグラムを出力。管理可能 (1.4.2で導入)。jmap - Memory Map コマンドは同等の機能を提供する。
-XX:-PrintConcurrentLocks [CTRL]+[BREAK] スレッドダンプで java.util.concurrent ロックを出力する。管理可能 (6で導入)。jstack - Stack Trace コマンドは同等の機能を提供する。
-XX:-PrintCommandLineFlags コマンドラインに現れたフラグを出力する (5.0で導入)。
-XX:-PrintCompilation メソッドがコンパイルされた時にメッセージを出力。
-XX:-PrintGC ガベージコレクションでメッセージを出力。管理可能
-XX:-PrintGCDetails ガベージコレクションで詳細を出力。管理可能 (1.4.0で導入)。
-XX:-PrintGCTimeStamps ガベージコレクションでタイムスタンプを出力。管理可能 (1.4.0で導入) (プロセス起動時からの秒数で出力されるので使うなら -XX:+PrintGCDateStamps の方がお勧め)
-XX:-PrintTenuringDistribution tenuring (殿堂入り) 年齢情報を出力。
-XX:-TraceClassLoading クラスのロードをトレース。
-XX:-TraceClassLoadingPreorder (ロードされていない) 参照によってロードされたすべてのクラスをトレース (1.4.2で導入)。
-XX:-TraceClassResolution 定数プールの消散をトレース (1.4.2で導入)。
-XX:-TraceClassUnloading クラスのアンロードをトレース。
-XX:-TraceLoaderConstraints ローダ制約の記録をトレース (6で導入)。
-XX:+PerfSaveDataToFile 終了時に jvmstat のバイナリデータを保存。
-XX:ParallelGCThreads= Young および Old 並列 GCGC スレッド数を設定。デフォルト値は JVM が動作しているプラットフォームによって異なる。
-XX:+UseCompressedOops Java ヒープサイズが 32GB 以下で最適化された 64bit パフォーマンスを得るために圧縮ポインタ (64bit ポインタの代わりに 32bit オフセットとして表現されるオブジェクトの参照) の使用を有効にする。
-XX:+AlwaysPreTouch JVM 初期化中に Java ヒープをプレ touch する。ヒープ上の全ページはアプリケーション実行中に段階的に行われるのではなく、初期化中の需要ゼロ状態で行われる。
-XX:AllocatePrefetchDistance= オブジェクト割り当てに対するプリフェッチの距離を設定。新しいオブジェクトの値が書き込まれようとしているメモリは、最後に割り当てられたオブジェクトのアドレスからこの距離 (バイト) でキャッシュにプリフェッチされる。各 Java スレッドは自分の割り当てポインタを持っている。デフォルト値は JVM が実行中のプラットフォームによって異なる。
-XX:InlineSmallCode= 事前コンパイルされたメソッドが、それから生成されたネイティブコードのサイズがこれより小さい場合にのみインライン展開する。デフォルト値は JVM が実行中のプラットフォームにより異なる。
-XX:MaxInlineSize=35 インライン化されるメソッドの最大バイトコードサイズ。
-XX:FreqInlineSize= 頻繁実行によってインライン化されるメソッドの最大バイトコードサイズ。デフォルト値は JVM が実行中のプラットフォームによって異なる。
-XX:LoopUnrollLimit= サーバコンパイラで、この値より小さい中間表現ノード数の場合にループ本体を展開する。サーバコンパイラで使用される制限は実際の値ではなくこの値の関数作用値。デフォルト値は JVM が実行されているプラットフォームにより異なる。
-XX:InitialTenuringThreshold=7 並列 Young GC の適用 GC サイジングで使用するための初期 Tenuring しきい値を設定。Tenuring しきい値は Old または Tenuring 世代に昇格する前に Young GC でオブジェクトが生存した回数。
-XX:MaxTenuringThreshold= 適応 GC サイジングで使用するための最大 Tenuring しきい値。現在の最大値は 15。デフォルト値は並列 GC で 15、CMS で 4。

メモ

原文に記載されていないオプションなど。

-XX:UseParNewGC 並列 Young GC を使用。並列 Mark-Seep GC と併用可能。
-XX:-PrintHeapAtGC GC 前後の詳細なヒープ情報を出力。
-XX:-PrintGCDateStamps GC を 2012-01-01T00:00:00.000+0900 形式のタイムスタンプで出力。
-XX:-CMSIncrementalMode (未調査)
-XX:MaxGCPauseMillis=nnn GC時に停止する最大ミリ秒(未調査)