251

jconsole でアクセスするために JVM で JMX をアクティブにする方法は?

4

12 に答える 12

318

関連するドキュメントは次の場所にあります。

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

于 2009-05-13T09:02:34.410 に答える
78

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必要に応じて/ firewallrules を使用して、そのポートの接続を許可します

それは機能しますが、確かに自動化可能なソリューションではありません。jconsole からVisualVMへのアップグレードを選択したのは、実行中のポートを明示的に指定できるからですjstatd。VisualVM で、新しいリモート ホストを追加し、上記で指定した値に関連する値で更新します。

リモート ホストの追加

次に、新しいリモート ホスト接続を右クリックし、Add JMX Connection...

JMX 接続を追加

のチェックボックスをオンにすることを忘れないでくださいDo not require SSL connection。うまくいけば、それで接続できるはずです。

于 2016-11-17T22:34:21.513 に答える
10

最新版の Java 6 では、JMX の呪文なしで起動した後でも、jconsole が実行中のプロセスにアタッチできることに注意してください。

利用可能な場合は、プロファイラーを含む実行中のプロセスに関する豊富な情報を提供する jvisualvm も検討してください。

于 2009-05-13T16:48:09.627 に答える
7

私は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
于 2013-11-20T14:47:55.950 に答える
6

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) に解決されるように編集しました。

于 2014-04-18T15:24:45.727 に答える
2

次のコマンド ライン パラメータを使用して 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を入力して、[接続] をクリックします。

于 2012-05-12T10:22:42.117 に答える