「-XX
」という接頭辞が付いたコマンド行オプションは、Java HotSpot仮想マシンに固有のものです。これらのオプションの多くは、パフォーマンス・チューニングや診断を行うために重要であるため、この付録で説明されています。使用可能なすべての-XX
オプションについては、「Java HotSpot VMオプション」を参照してください。
jinfo -flag
コマンドを使用すると、指定されたJavaプロセスの特定のJava VMフラグの値を動的に設定、設定解除または変更できます。「jinfoユーティリティ」およびJConsoleユーティリティを参照してください。
これらのフラグの完全なリストについては、JConsoleユーティリティの「MBean」タブを使用してください。com.sun.management
ドメインにあるHotSpotDiagnostic
MBeanのDiagnosticOptions
属性の値のリストを参照してください。フラグは次のとおりです。
HeapDumpOnOutOfMemoryError
HeapDumpPath
PrintGC
PrintGCDetails
PrintGCTimeStamps
PrintClassHistogram
PrintConcurrentLocks
このオプションは、JavaヒープまたはPermanent世代からの割当てが満たされない場合に、Java HotSpot VMにヒープ・ダンプを生成するよう指示します。このオプションを使って実行するときのオーバーヘッドはないため、OutOfMemoryError
例外が表面化するまでに長い時間のかかる本番システムに役立つ可能性があります。
JConsoleユーティリティの「MBean」タブを使用して、このオプションを実行時に指定することもできます。
ヒープ・ダンプはHPROFバイナリ形式であるため、この形式をインポートできる任意のツールを使用して解析できます。たとえば、jhat
ツールを使用すると、そのダンプの基本的な解析を行うことができます。jhat
ツールの詳細は、「jhatユーティリティ」を参照してください。
例D-1は、このフラグを設定してメモリー不足の結果を示しています。
例D-1 メモリー不足のサンプル・コード
$ java -XX:+HeapDumpOnOutOfMemoryError -mn256m -mx512m ConsumeHeap
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid2262.hprof ...
Heap dump file created [531535128 bytes in 14.691 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at ConsumeHeap$BigObject.(ConsumeHeap.java:22)
at ConsumeHeap.main(ConsumeHeap.java:32)
ConsumeHeap
によってJavaヒープがいっぱいになり、メモリーが使い果たされます。java.lang.OutOfMemoryError
例外がスローされると、ヒープ・ダンプ・ファイルが作成されます。この場合、そのファイルは507MBで、現在のディレクトリにjava_pid2262.hprofという名前で作成されます。
デフォルトでは、前述の例のように、ヒープ・ダンプはVMの作業ディレクトリにあるjava_pidpid.hprofと呼ばれるファイル内に作成されます。-XX:HeapDumpPath=
オプションを使用すれば、別のファイル名またはディレクトリを指定できます。たとえば、-XX:HeapDumpPath=/disk2/dumps
を指定すると、ヒープ・ダンプは/disk2/dumpsディレクトリに生成されます。
致命的エラーが発生すると、Java HotSpot VMはオプションでユーザー指定のスクリプトまたはコマンドを実行できます。スクリプトまたはコマンドは、-XX:OnError=
stringコマンド行オプションを使って指定されます(stringは単一のコマンド、またはセミコロンで区切られたコマンドのリスト)。この文字列内では、%p
のすべての出現箇所が現在のPIDに置き換えられ、%%
のすべての出現箇所が単一の%
に置き換えられます。次の例は、java
ランチャを使用してMyAppという名前のJavaアプリケーションを起動するときに、このオプションをどのように使用できるかを示しています。
java -XX:OnError="pmap %p" MyApp
Oracle Solarisオペレーティング・システムでは、pmap
コマンドはプロセスのアドレス空間に関する情報を表示します。前述の例では、致命的エラーが発生した場合にpmap
コマンドが実行されて、現在のプロセスのアドレス空間が表示されます。
java -XX:OnError="cat hs_err_pid%p.log | mail support@acme.com" MyApp
前述の例では、致命的エラーが発生した場合に、致命的エラー・ログ・ファイルの内容がサポート・エイリアスにメール送信されます。
java -XX:OnError="gcore %p; dbx - %p" MyApp
Oracle Solarisオペレーティング・システムでは、gcore
コマンドは指定されたプロセスのコア・イメージを作成し、dbx
コマンドはデバッガを起動します。前述の例では、予想外のエラーが発生した場合に、gcore
コマンドが実行されて現在のプロセスのコア・イメージが作成され、さらにデバッガが起動されてそのプロセスに接続されます。
java -XX:OnError="gdb - %p" MyApp
Linuxでは、gdb
コマンドはデバッガを起動します。前述の例では、予想外のエラーが発生した場合にgdb
デバッガが起動され、現在のプロセスに接続されます。
java -XX:OnError="userdump.exe %p" MyApp
Windowsでは、userdump.exe
ユーティリティは指定されたプロセスのクラッシュ・ダンプを作成します。このユーティリティは、Windowsに付属していないため、Microsoft OEM Support Toolsパッケージの一部としてMicrosoftのWebサイトからダウンロードするようにしてください。
前述の例では、致命的エラーが発生した場合にuserdump.exe
ユーティリティが実行されて、現在のプロセスのコア・ダンプが作成されます。
注: この例では、userdump.exe ユーティリティへのパスがPATH 変数に定義されているものと想定します。 |
ヒント
|
Windowsでのクラッシュ・ダンプの作成の詳細は、「Windowsでのクラッシュ・ダンプの収集」を参照してください。
このオプションが設定されているときに致命的エラーが発生した場合、HotSpot VMはその致命的エラーに関する情報を表示し、ネイティブ・デバッガが起動されるかどうかを指定するようユーザーに求めます。Oracle SolarisおよびLinuxオペレーティング・システムの場合は、その出力とプロンプトがアプリケーション・コンソール(標準入力と標準出力)に送信されます。Windowsの場合は、Windowsメッセージ・ボックスが表示されます。
例D-2は、Linuxシステムで発生した致命的エラーを示しています。
例D-2 Linuxシステムでの致命的エラー
============================================================================== Unexpected Error ------------------------------------------------------------------------------ SIGSEGV (0xb) at pc=0x2000000001164db1, pid=10791, tid=1026 Do you want to debug the problem? To debug, run 'gdb /proc/10791/exe 10791'; then switch to thread 1026 Enter 'yes' to launch gdb automatically (PATH must include gdb) Otherwise, press RETURN to abort... ==============================================================================
この場合は、SIGSEGV
エラーが発生し、ユーザーはgdb
デバッガが起動されてプロセスに接続するのかどうかを指定するよう求められます。ユーザーが「y
」または「yes
」と入力すると、gdb
が起動されます(それがPATH
変数内に設定されているものと想定)。
Oracle Solarisオペレーティング・システムでは、メッセージは前述のものと似ていますが、dbx
デバッガを起動するようユーザーが求められる点が異なります。
Windowsでは、メッセージ・ボックスが表示されます。ユーザーが「はい」をクリックした場合、VMはデフォルト・デバッガの起動を試みます。このデバッガは、「Windowsでのクラッシュ・ダンプの収集」で説明されているレジストリ設定によって構成されます。Microsoft Visual Studioがインストールされている場合、デフォルト・デバッガは通常msdev.exe
になるよう構成されます。
前述の例では、PID (pid=10791
)だけでなく、スレッドID (tid=1026
)も出力に含まれています。デバッガが起動された場合、デバッガの初期段階の1つでスレッドが選択され、そのスタック・トレースが取得される可能性があります。
プロセスは応答を待っているので、ほかのツールを使ってクラッシュ・ダンプを取得したり、プロセスの状態を問い合わせたりできます。たとえば、Oracle Solarisオペレーティング・システムでは、gcore
ユーティリティを使用してコア・ダンプを取得できます。
Windowsでは、userdump
またはwindbg
プログラムを使用して、ワトソン博士のクラッシュ・ダンプを取得できます。windbg
ユーティリティはMicrosoftのDebugging Tools for Windowsに含まれており、「Windowsでのクラッシュ・ダンプの収集」で説明されています。windbg
で、「Attach to a Process」メニュー・オプションを選択すると、プロセスの一覧が表示されてPIDを入力するよう求められます。HotSpot VMでは、PIDを含むメッセージ・ボックスが表示されます。選択すると、.dump /f
コマンドを使ってクラッシュ・ダンプを強制できます。例D-1は、crash.dump
というファイルに作成されたクラッシュ・ダンプの例です。
一般に、デバッガ・ツールを利用できる開発環境では、-XX:+ShowMessageBoxOnError
オプションの方が役立ちます。致命的エラーの発生時に、決められた一連のコマンドまたはスクリプトが実行される本番環境には、-XX:OnError
オプションの方が適しています。
トラブルシューティングに役立つ可能性のある-XX
コマンド行オプションは、他にもいくつかあります。
-XX:OnOutOfMemoryError
=string
このオプションを使用すると、OutOfMemoryError
例外がスローされたときに実行されるコマンドまたはスクリプトを指定できます。
-XX:ErrorFile
=filename
このオプションを使用すると、致命的エラー・ログ・ファイルの場所を指定できます(「致命的エラー・ログの場所」を参照)。
-xx:HeapDumpPath
=path
このオプションを使用すると、ヒープ・ダンプの場所を指定できます(「-XX:HeapDumpOnOutOfMemoryErrorオプション」を参照)。
-XX:MaxPermSize
=size
このオプションを使用すると、Permanent世代のメモリーのサイズを指定できます(「Exception in thread thread_name: java.lang.OutOfMemoryError: GC Overhead limit exceeded」を参照)。
-XX:+PrintCommandLineFlags
このオプションを使用すると、VMコマンド行フラグをすべて出力できます(「バグ・レポート用のデータの収集」を参照)。
-XX:+PrintConcurrentLocks
このオプションを使用すると、Ctrl+Breakハンドラによって、各スレッドが所有する並行ロックの一覧が出力されます。
-XX:+PrintClassHistogram
このオプションを使用すると、Ctrl+Breakハンドラによって、ヒープ・ヒストグラムが出力されます。
-XX:+PrintGCDetails
and-XX:+PrintGCTimeStamps
これらのオプションを使用すると、ガベージ・コレクションに関する詳細情報を出力できます(「-verbose:gcオプション」を参照)。
-XX:+UseAltSigs
Oracle Solaris 8および9オペレーティング・システムでこのオプションを使用すると、SIGUSR1
およびSIGUSR2
のかわりに代替シグナルを使用するよう、HotSpot VMに指示できます(「Oracle SolarisおよびLinuxオペレーティング・システムでのシグナル処理」を参照)。
-XX:+UseConcMarkSweepGC
、-XX:+UseSerialGC
および-XX:+UseParallelGC
これらのオプションを使用すると、使用されるガベージ・コレクション・ポリシーを指定できます(「ガベージ・コレクション中のクラッシュの回避」を参照)。