jconsole でアクセスするために JVM で JMX をアクティブにする方法は?
12 に答える
関連するドキュメントは次の場所にあります。
http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html
次のパラメーターを使用してプログラムを開始します。
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9010
-Dcom.sun.management.jmxremote.rmi.port=9010
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
たとえば、次のようにします。
java -Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=9010 \
-Dcom.sun.management.jmxremote.local.only=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-jar Notepad.jar
-Dcom.sun.management.jmxremote.local.only=false
必ずしも必要ではありませんが、これがないと Ubuntu では動作しません。エラーは次のようになります。
01 Oct 2008 2:16:22 PM sun.rmi.transport. customer .TCPTransport$AcceptLoop executeAcceptLoop
WARNING: RMI TCP Accept-0: accept loop for ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=37278] throws
java.io.IOException: The server sockets created using the LocalRMIServerSocketFactory only accept connections from clients running on the host where the RMI remote objects have been exported.
at sun.management.jmxremote.LocalRMIServerSocketFactory$1.accept(LocalRMIServerSocketFactory.java:89)
at sun.rmi.transport. customer .TCPTransport$AcceptLoop.executeAcceptLoop(TCPTransport.java:387)
at sun.rmi.transport. customer .TCPTransport$AcceptLoop.run(TCPTransport.java:359)
at java.lang.Thread.run(Thread.java:636)
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6754672を参照してください。
誰でもアクセスできるようにすることにも注意し-Dcom.sun.management.jmxremote.authenticate=false
てください。ただし、ローカル マシン上の JVM を追跡するためだけに使用する場合は問題ありません。
更新:
場合によっては、サーバーにアクセスできませんでした。このパラメーターも設定すると、これは修正されました。-Djava.rmi.server.hostname=127.0.0.1
Docker コンテナーで実行すると、接続に関する追加の問題が大量に発生するため、これが誰かの役に立てば幸いです。以下で説明する次のオプションを追加する必要がありました。
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=${DOCKER_HOST_IP}
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.rmi.port=9998
DOCKER_HOST_IP
jconsole をローカルで使用する場合とは異なり、コンテナー内からおそらく表示されるものとは異なる IP をアドバタイズする必要があります。${DOCKER_HOST_IP}
Docker ホストの外部で解決可能な IP (DNS 名)に置き換える必要があります。
JMX リモート & RMI ポート
JMX は、接続の調停時に別のポートを使用して一部のデータを転送するリモート管理インターフェイス ( jstat )へのアクセスも必要とするようです。この値を設定するためにすぐに明らかな場所はどこにもありませんでした。リンクされた記事では、プロセスは次のとおりです。jconsole
jconsole
ロギングを有効にしてから接続してみてください- 失敗
jconsole
使用しようとしたポートを特定するiptables
必要に応じて/firewall
rules を使用して、そのポートの接続を許可します
それは機能しますが、確かに自動化可能なソリューションではありません。jconsole からVisualVMへのアップグレードを選択したのは、実行中のポートを明示的に指定できるからですjstatd
。VisualVM で、新しいリモート ホストを追加し、上記で指定した値に関連する値で更新します。
次に、新しいリモート ホスト接続を右クリックし、Add JMX Connection...
のチェックボックスをオンにすることを忘れないでくださいDo not require SSL connection
。うまくいけば、それで接続できるはずです。
最新版の Java 6 では、JMX の呪文なしで起動した後でも、jconsole が実行中のプロセスにアタッチできることに注意してください。
利用可能な場合は、プロファイラーを含む実行中のプロセスに関する豊富な情報を提供する jvisualvm も検討してください。
私はWAS ND 7.0を使用しています
私の JVM は、JConsole で監視される次のすべての引数を必要とします
-Djavax.management.builder.initial=
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=8855
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
Linux では、次のパラメーターを使用しました。
-Djavax.management.builder.initial=
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9010
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
/etc/hosts
また、ホスト名がループバック アドレス (127.0.0.1) ではなくホスト アドレス (192.168.0.x) に解決されるように編集しました。
次のコマンド ライン パラメータを使用して Java アプリケーションを実行します。
-Dcom.sun.management.jmxremote.port=8855
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
jmx ホストでデジタル証明書を設定したくない場合は、 -Dcom.sun.management.jmxremote.ssl=falseパラメータを使用することが重要です。
IP アドレスが192.168.0.1のマシンでアプリケーションを起動した場合は、 jconsoleを開き、[リモート プロセス] フィールドに192.168.0.1:8855を入力して、[接続] をクリックします。