Java Platform, Standard Editionトラブルシューティング・ガイド
目次      

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

-XXオプションに加えて、ほかにも多くのコマンド行オプションがトラブルシューティング情報を提供できます。 このセクションでは、これらのオプションのいくつかについて説明します。

-Xcheck:jniオプション

このオプションは、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 Native Interfaceのドキュメントを参照してください。

-verbose:classオプション

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

-verbose:gcオプション

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

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

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

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

-verbose:jniオプション

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

目次      

Copyright © 1993, 2025, Oracle and/or its affiliates. All rights reserved.