JconsoleでアクセスするためにJVMでJMXをアクティブ化する方法は?
関連するドキュメントは次の場所にあります。
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.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
name__ですぐにわかる場所はありませんでした。リンクされた記事では、プロセスは次のとおりでした。
jconsole
name__から接続してみてくださいjconsole
name__が使用を試みたかを把握するiptables
name __/firewall
name__ルールを使用して、そのポートが接続できるようにしますそれは機能しますが、確かに自動化可能なソリューションではありません。 jconsoleから VisualVM へのアップグレードを選択しました。これは、jstatd
name__が実行されているポートを明示的に指定できるようにするためです。 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
また、ホスト名がループバックアドレス(127.0.0.1)ではなくホストアドレス(192.168.0.x)に解決されるように/etc/hosts
を編集しました
次のコマンドラインパラメータを使用して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を開きますRemote Processフィールドで、Connectをクリックします。
以下のコマンドラインパラメータとともに、
-Dcom.Sun.management.jmxremote.port=9999
-Dcom.Sun.management.jmxremote.authenticate=false
-Dcom.Sun.management.jmxremote.ssl=false
Linuxサーバーでは、imx接続が成功しない場合があります。これは、クラウドLinuxホストの/ etc/hostsでホスト名がホストアドレスに解決されるためです。
それを修正する最善の方法は、ネットワーク内の他のマシンから特定のLinuxサーバーにpingを実行し、そのホストIPアドレスを
-Djava.rmi.server.hostname=IP address that obtained when you ping that linux server.
ただし、ifconfig.meを使用してLinuxサーバーから取得するipaddressに依存しないでください。そこに表示されるIPは、ホストファイルに存在するマスクされたものです。
私はこの正確な問題を抱えていましたが、 正しい設定をテストして理解するためのGitHubプロジェクトを作成しました 。
これには、サポートスクリプトを含む有効なDockerfile
と、簡単なテストのための単純なdocker-compose.yml
が含まれています。
最初に、JavaプロセスがすでにJMXパラメーターで実行されているかどうかを確認する必要があります。これを行う:
ps -ef | grep Java
監視する必要があるJavaプロセスを確認します。 jmx rmiパラメーターDjmx.rmi.registry.port = xxxxが表示されている場合は、Java visualvmでここに記載されているポートを使用して、jmx接続でリモート接続します。
Jmx rmiポートを介して実行されていない場合、以下のパラメーターを使用してJavaプロセスを実行する必要があります。
-Djmx.rmi.registry.port=1234 -Djmx.rmi.port=1235 -Dcom.Sun.management.jmxremote.authenticate=false -Dcom.Sun.management.jmxremote.ssl=false
注:ポート番号は選択に基づいています。
これで、このポートをjmx coneectionに使用できます。ここではポート1234
です。