プライマリ・コンテンツに移動
Java Platform, Standard Editionトラブルシューティング・ガイド
リリース9
E90916-02
目次へ移動
目次

前
次

D コマンド行オプション

この付録では、Java HotSpot VMの問題を診断する際に役立つ可能性のあるいくつかのコマンド行オプションについて説明します。

この付録の内容は次のとおりです。

Java HotSpot VMコマンド行オプション

-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

-XX:HeapDumpOnOutOfMemoryErrorオプション

このオプションは、JavaヒープまたはPermanent世代からの割当てが満たされない場合に、Java HotSpot VMにヒープ・ダンプを生成するよう指示します。このオプションを使用して実行するときのオーバーヘッドはないため、OutOfMemoryError例外が表示されるまでに長い時間のかかる本番システムに役立つ可能性があります。

JConsoleユーティリティの「MBean」タブを使用して、このオプションを実行時に指定することもできます。

次の例は、このフラグ・セットによるメモリー不足という結果を示しています。

$ 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ディレクトリに生成されます。

-XX:OnErrorオプション

致命的エラーが発生すると、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でのクラッシュ・ダンプの収集」を参照してください。

-XX:ShowMessageBoxOnErrorオプション

このオプションが設定されているときに致命的エラーが発生した場合、HotSpot VMはその致命的エラーに関する情報を表示し、ネイティブ・デバッガが起動されるかどうかを指定するようユーザーに求めます。Oracle SolarisおよびLinuxオペレーティング・システムの場合は、その出力とプロンプトがアプリケーション・コンソール(標準入力と標準出力)に送信されます。Windowsの場合は、Windowsメッセージ・ボックスが表示されます。

次の例は、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オペレーティング・システムでは、メッセージはLinuxの例と似ていますが、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を含むメッセージ・ボックスが表示されます。PIDを選択した後、.dump /fコマンドを使用してクラッシュ・ダンプを強制できます。例D-1は、crash.dumpというファイルに作成されたクラッシュ・ダンプの例です。

図D-1 windbgで作成されたクラッシュ・ダンプの例

図D-1の説明が続きます
「図D-1 windbgで作成されたクラッシュ・ダンプの例」の説明

一般に、デバッガ・ツールを利用できる開発環境では、-XX:+ShowMessageBoxOnErrorオプションの方が役立ちます。致命的エラーの発生時に、決められた一連のコマンドまたはスクリプトが実行される本番環境には、-XX:OnErrorオプションの方が適しています。

その他の-XXオプション

トラブルシューティング時に役立つ可能性のある-XXコマンド行オプションは、他にもいくつかあります。

  • -XX:OnOutOfMemoryError=string

    このオプションを使用すると、OutOfMemoryError例外がスローされたときに実行されるコマンドまたはスクリプトを指定できます。

  • -XX:ErrorFile=filename

    このオプションは、致命的エラー・ログ・ファイルの場所を指定するために使用できます。「致命的エラー・ログの場所」を参照してください。

  • -xx:HeapDumpPath=path

    このオプションは、ヒープ・ダンプの場所を指定するために使用できます。「-XX:HeapDumpOnOutOfMemoryErrorオプション」を参照してください。

  • -XX:MaxPermSize=size

    このオプションは、Permanent世代メモリーのサイズを指定するために使用できます。「OutOfMemoryError例外の理解」を参照してください。

  • -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およびmacOSでのシグナルの処理」を参照してください。

  • -XX:+UseConcMarkSweepGC , -XX:+UseSerialGC and -XX:+UseParallelGC

    このオプションは、使用されるガベージ・コレクション・ポリシーを指定するために使用できます。「ガベージ・コレクション中のクラッシュの回避」を参照してください。

その他のコマンド行オプション

-XXオプションに加えて、ほかにも多くのコマンド行オプションがトラブルシューティング情報を提供できます。

このセクションでは、これらのオプションのいくつかについて説明します。

-Xcheck:jniオプション

このオプションは、Java Native Interface (JNI)を使用するアプリケーションの問題を診断する際に役立ちます。ネイティブ・コードにバグが含まれているせいで、HotSpot VMがクラッシュしたり、正しく動作しなかったりする場合があります。

次の例にあるように、-Xcheck:jniオプションは、アプリケーションを起動するコマンド行に追加されます。

java -Xcheck:jni MyApp

-Xcheck:jniオプションを指定すると、VMではJNI関数に渡された引数に対して追加の検証を行います。

注意:

このオプションにより、すべての無効な引数が見つかること、またはアプリケーション・コード内のロジックのバグが診断されることは保証されていませんが、このような問題の多くを診断するのに役立ちます。

無効な引数が検出されると、VMはアプリケーション・コンソールまたは標準出力にメッセージを出力し、問題のスレッドのスタック・トレースを出力してVMを停止します。

次の例では、null値を許可しないJNI関数にnull値が間違って渡されています。

FATAL ERROR in native method: Null object passed to JNI
    at java.net.PlainSocketImpl.socketAccept(Native Method)
    at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:343)
    - locked <0x450b9f70> (a java.net.PlainSocketImpl)
    at java.net.ServerSocket.implAccept(ServerSocket.java:439)
    at java.net.ServerSocket.accept(ServerSocket.java:410)
    at org.apache.tomcat.service.PoolTcpEndpoint.acceptSocket
                        (PoolTcpEndpoint.java:286)
    at org.apache.tomcat.service.TcpWorkerThread.runIt
                        (PoolTcpEndpoint.java:402)
    at org.apache.tomcat.util.ThreadPool$ControlRunnable.run
                        (ThreadPool.java:498)
    at java.lang.Thread.run(Thread.java:536)

次の例では、jfieldID引数を必要としていたJNI関数に不適切な引数が渡されています。

FATAL ERROR in native method: Instance field not found in JNI get/set 
                        field operations
        at java.net.PlainSocketImpl.socketBind(Native Method)
        at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:359)
        - locked <0xf082f290> (a java.net.PlainSocketImpl)
        at java.net.ServerSocket.bind(ServerSocket.java:318)
        at java.net.ServerSocket.<init>(ServerSocket.java:185)
        at jvm003a.<init>(jvm003.java:190)
        at jvm003a.<init>(jvm003.java:151)
        at jvm003.run(jvm003.java:51)
        at jvm003.main(jvm003.java:30)

次に、-Xcheck:jniオプションが診断に役立つ可能性のある、その他の問題の例を示します。

  • 間違ったスレッド用のJNI環境が使用される場合

  • 無効なJNI参照が使用される場合

  • 配列以外の型への参照が、配列型を必要とする関数に渡される場合

  • 非staticフィールドIDが、staticフィールドIDを必要とする関数に渡される場合

  • 例外が保留になっている状態で、JNI呼出しが行われる場合

通常、-Xcheck:jniオプションによって検出されるエラーはすべて致命的エラーです(つまり、エラーが出力されてVMが停止される)。この動作には例外が1つあります。JNI呼出しがJNIクリティカル・リージョン内で行われた場合です。次の例に示すように、この場合は、次の致命的でない警告メッセージが出力されます。

Warning: Calling other JNI functions in the scope of 
Get/ReleasePrimitiveArrayCritical or Get/ReleaseStringCritical

JNIクリティカル・リージョンは、ネイティブ・コードがJNI関数GetPrimitiveArrayCriticalまたはGetStringCriticalを使用して、Javaヒープ内の配列または文字列への参照を取得するときに作成されます。この参照は、ネイティブ・コードが対応するrelease関数を呼び出すまで保持されます。getとreleaseの間にあるコードはJNIクリティカル・セクションと呼ばれ、その間HotSpot VMは、ガベージ・コレクションの発生を許可する状態にVMを移行できません。一般的な推奨事項は、JNIクリティカル・セクション内部でその他のJNI関数、特にデッドロックを発生させる可能性のあるJNI関数を使用しないことです。したがって、-Xcheck:jniオプションによって出力された上記の警告は、潜在的な問題を示すものであり、必ずしもアプリケーションのバグを示すとはかぎりません。

-verbose:classオプション

このオプションは、クラスのロードとアンロードのロギングを有効にします。

-verbose:gcオプション

このオプションは、ガベージ・コレクション(GC)情報のロギングを有効にします。これを他のHotSpot VM固有のオプション(-XX:+PrintGCDetails-XX:+PrintGCTimeStampsなど)と組み合せることで、GCに関する詳細情報を取得できます。その情報の出力には、各GCの前後の世代のサイズ、ヒープの合計サイズ、昇格されたオブジェクトのサイズ、所要時間などが含まれています。

これらのオプションおよびGCの解析とチューニングの詳細は、GC Portalの記事に記載されています。

-verbose:gcオプションは、実行時に管理APIまたはJVM TIを使用して動的に有効にできます。「カスタム診断ツール」を参照してください。

JConsoleモニタリングおよび管理ツールが管理VMに接続されているときは、そのツールでこのオプションを有効または無効にすることもできます。「JConsole」を参照してください。

-verbose:jniオプション

このオプションは、JNIのロギングを有効にします。JNIまたはネイティブ・メソッドが解決されると、HotSpot VMはアプリケーション・コンソール(標準出力)にトレース・メッセージを出力します。また、ネイティブ・メソッドがJNI RegisterNative関数を使用して登録されるときもトレース・メッセージを出力します。-verbose:jniオプションは、ネイティブ・ライブラリを使用するアプリケーションの問題を診断する際に役立つ可能性があります。