この付録では、Java HotSpot VMの問題をトラブルシューティングする際に役立つ可能性のある環境変数とシステム・プロパティについて説明します。
「バグ・レポートの提出」の「環境変数」に、環境変数の収集に関する情報が含まれています。
この付録の内容は次のとおりです。
多くの環境では、必要なコマンド行オプションを使用してアプリケーションを起動するコマンド行には容易にアクセスできません。
これは、埋込みVMを使用するアプリケーション(VMの起動にJava Native Interface (JNI)呼出しAPIを使用することを意味する)や、起動がスクリプト内で深く入れ子になっている場合に頻繁に起こります。このような環境では、JAVA_TOOL_OPTIONS
環境変数がコマンド行の拡張に役立つ可能性があります。
この環境変数が設定されていると、JNI_CreateJavaVM
関数(JNI呼び出しAPIの中にある)はその
JavaVMInitArgs
引数で提供されるオプションの先頭に、その環境変数の値を追加します。
注意:
セキュリティ上の理由により、このオプションが無効になる場合があります。たとえば、Oracle Solarisオペレーティング・システムでは、有効なユーザーまたはグループのIDが実際のIDと異なる場合に、このオプションが無効になります。
この環境変数では、ツールの初期化(具体的には-agentlib
または-javaagent
オプションを使用したネイティブまたはJavaプログラミング言語エージェントの起動)を指定できます。
この変数は、診断の目的でコマンド行をほかのオプションを使って拡張するためにも使用できます。たとえば、-XX:OnError
オプションを使用すると、致命的エラーが発生した場合に実行されるスクリプトまたはコマンドを指定できます。
この環境変数はJNI_CreateJavaVM
関数の呼出し時に検査されるため、通常はランチャによって処理されるオプションを使用したコマンド行の拡張(-client
または-server
オプションを使ったVM選択など)には使用できません。
このシステム・プロパティは、Java Runtime Environment (JRE)のセキュリティ・システムが、実行中にトレース・メッセージを出力するかどうかを制御します。
このオプションは、SecurityException
がスローされたときにセキュリティ・マネージャに関連する問題を診断する場合に役立つ可能性があります。
java.security.debug
プロパティには、次の値を指定できます。
access
checkPermission
の結果をすべて出力します。
次の追加のオプションをaccess
オプションとともに指定できます。
stack
スタック・トレースを含めます。
domain
コンテキスト内のすべてのドメインをダンプします。
failure
例外をスローする前に、アクセス権を保持しなかったスタックおよびドメインをダンプします。
jar
JARの検証情報を出力します。
policy
SecureClassLoader
によって割り当てられるアクセス権を出力します。
scl
たとえば、checkPermission
のすべての結果を出力し、コンテキスト内のすべてのドメインをトレースするには、java.security.debug
プロパティをaccess,stack
に設定します。アクセス障害をトレースするには、このプロパティをaccess,failure
に設定します。
次の例は、checkPermission
障害の出力を示しています。
$ java -Djava.security.debug="access,failure"
MyApp
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 MyApp.main(MyApp.java:7)
java.security.debug
システム・プロパティの詳細は、Java Platform, Standard Editionセキュリティ開発者ガイドのセキュリティのトラブルシューティングに関する項を参照してください。