このセクションでは、トラブルシューティングの場面で役立つ可能性のある環境変数とシステムプロパティーについて説明します。
「7.3 バグレポート用のデータの収集」の
「7.3.5 環境変数」も参照してください。
JAVA_HOME 環境変数は、JDK ソフトウェアがインストールされているディレクトリを示します。
多くの環境では、アプリケーションを起動するコマンド行には容易にアクセスできません。これは、埋め込み VM を使用するアプリケーション (VM の起動に JNI 呼び出し API を使用することを意味する) や、起動がスクリプト内で深く入れ子になっている場合に頻繁に起こります。このような環境では、JAVA_TOOL_OPTIONS 環境変数がコマンド行の拡張に役立つ可能性があります。
この環境変数が設定されていると、JNI_CreateJavaVM 関数 (JNI 呼び出し API の中にある) はその JavaVMInitArgs 引数で提供されるオプションの先頭に、その環境変数の値を追加します。場合によっては、セキュリティー上の理由でこのオプションが無効になることがあります (たとえば、Solaris OS では、有効なユーザーまたはグループの ID が実際の ID と異なる場合に、このオプションが無効になります)。
この環境変数では、ツールの初期化 (具体的には -agentlib または -javaagent オプションを使用したネイティブまたは Java プログラミング言語エージェントの起動) を指定できます。次の例では、アプリケーションの起動時に HPROF プロファイラが起動されるように、この環境変数が設定されています。
$ export JAVA_TOOL_OPTIONS="-agentlib:hprof"
この変数は、診断の目的でコマンド行をほかのオプションを使って拡張するためにも使用できます。たとえば、-XX:OnError オプションを使用すると、致命的エラーが発生した場合に実行されるスクリプトまたはコマンドを指定できます。
この環境変数は JNI_CreateJavaVM の呼び出し時に検査されるため、通常はランチャー (-client または -server オプションを使用する VM 選択など) によって処理されるオプションを使ったコマンド行の拡張には使用できません。
JAVA_TOOL_OPTIONS 環境変数については、JVM Tool Interface のドキュメントの「AVA_TOOL_OPTIONS」セクションに詳しく説明されています。
java.security.debug システムプロパティーは、JRE のセキュリティーシステムが、実行中にトレースメッセージを出力するかどうかを制御します。このオプションは、SecurityException がスローされたときにセキュリティーマネージャーに関連する問題を診断する場合に役立つ可能性があります。
このプロパティーには、次の値を指定できます。
access - checkPermission の結果をすべて出力する
jar - jar の検証情報を出力する
policy - ポリシー情報を出力する
scl - SecureClassLoader が割り当てたアクセス権を出力する
access オプションには、次のサブオプションを使用できます。
stack - スタックトレースを含める
domain - コンテキスト内のすべてのドメインをダンプする
failure - 例外をスローする前に、アクセス権を保持しなかったスタックおよびドメインをダンプする
たとえば、checkPermission のすべての結果を出力し、コンテキスト内のすべてのドメインをトレースするには、java.security.debug プロパティーを access,stack に設定します。アクセス障害をトレースするには、このプロパティーを access,failure に設定します。
次の例は、checkPermission 障害の出力を示しています。
$ java -Djava.security.debug="access,failure" Application access denied (java.net.SocketPermission server.foobar.com resolve ) java.lang.Exception: Stack trace at java.lang.Thread.dumpStack(Thread.java:1158) at java.security.AccessControlContext.checkPermission (AccessControlContext.java:253) at java.security.AccessController.checkPermission(AccessController.java:427) at java.lang.SecurityManager.checkPermission(SecurityManager.java:532) at java.lang.SecurityManager.checkConnect(SecurityManager.java:1031) at java.net.InetAddress.getAllByName0(InetAddress.java:1117) at java.net.InetAddress.getAllByName0(InetAddress.java:1098) at java.net.InetAddress.getAllByName(InetAddress.java:1061) at java.net.InetAddress.getByName(InetAddress.java:958) at java.net.InetSocketAddress.<init>(InetSocketAddress.java:124) at java.net.Socket.<init>(Socket.java:178) at Test.main(Test.java:7)
java.security.debug システムプロパティーの詳細は、セキュリティーに関するチュートリアルを参照してください。