-XX
オプションに加えて、ほかにも多くのコマンド行オプションがトラブルシューティング情報を提供できます。このセクションでは、これらのオプションのいくつかについて説明します。
このオプションは、Java Native Interface (JNI)を使用するアプリケーションの問題を診断する際に役立ちます。ネイティブ・コードにバグが含まれているせいで、HotSpot VMがクラッシュしたり、正しく動作しなかったりする場合があります。
次の例にあるように、-Xcheck:jni
オプションは、アプリケーションを起動するコマンド行に追加されます。
java -Xcheck:jni MyApp
-Xcheck:jni
オプションを指定すると、VMではJNI関数に渡された引数に対して追加の検証を行います。注意: このオプションにより、すべての無効な引数が見つかること、またはアプリケーション・コード内のロジックのバグが診断されることは保証されていませんが、このような問題の多くを診断するのに役立ちます。
無効な引数が検出されると、VMはアプリケーション・コンソールまたは標準出力にメッセージを出力し、問題のスレッドのスタック・トレースを出力して、VMを強制的に終了させます。
例D-3は、null
値を許可しないJNI関数にnull
値が間違って渡された例を示しています。
例D-3 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)
例D-4は、jfieldID
引数を必要としているJNI関数に不適切な引数が渡された例を示しています。
例D-4 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クリティカル・リージョン内で行われた場合です。例D-5に示すように、この場合は、次の致命的でない警告メッセージが出力されます。
例D-5 致命的でない警告メッセージ
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
オプションによって出力された上記の警告は、潜在的な問題を示すものであり、必ずしもアプリケーションのバグを示すとはかぎりません。
JNIの詳細は、Javaネイティブ・インタフェースのドキュメントをを参照してください。
このオプションは、ガベージ・コレクション(GC)情報のロギングを有効にします。これを他のHotSpot VM固有のオプション(-XX:+PrintGCDetails
や-XX:+PrintGCTimeStamps
など)と組み合わせることで、GCに関する詳細情報を取得できます。その情報の出力には、各GCの前後の世代のサイズ、ヒープの合計サイズ、昇格されたオブジェクトのサイズ、所要時間などが含まれています。
これらのオプションおよびGCの解析とチューニングの詳細は、GC Portalの記事に記載されています。
-verbose:gc
オプションは、実行時に管理APIまたはJVM TIを使用して動的に有効にできます。これらのAPIの詳細は、「カスタム診断ツール」を参照してください。
JConsoleモニタリングおよび管理ツールが管理VMに接続されているときは、そのツールでこのオプションを有効または無効にすることもできます。詳細は、JConsoleを参照してください。