jconsoleを使用してアクセスするためにJVMでJMXをアクティブにする方法
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.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
com.sun.management.jmxremote
デフォルト値がであるのは私には奇妙ですtrue
。(あなたの日をありがとう!)スーパー明確にするため、JMXのNOBSとあまり馴染みのものは、私が使用し、特にに:com.sun.management.jmxremote=true
参考:docs.oracle.com/javase/8/docs/technotes/guides/management/...
Dcom.sun.management.jmxremote.rmi.port=9011
を開きました。ファイアウォールで追加して開くことも試みましたが、ファイアウォールが稼働している状態では接続できません。何かご意見は?何か逃したことがありますか?
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とは異なるIPをアドバタイズする必要があります。${DOCKER_HOST_IP}
Dockerホストの外部で解決可能なIP(DNS名)に置き換える必要があります。
JMXリモートおよびRMIポート
JMX は、接続を調停するときに別のポートを使用して一部のデータを転送するリモート管理インターフェース(jstat)へのアクセスも必要とするようです。この値を設定するためにすぐに明らかな場所はありませんでした。リンクされた記事では、プロセスは次のとおりでした。jconsole
jconsole
ログを有効にしてから接続してみてくださいjconsole
使用しようとしたポートを特定するiptables
/ firewall
ルールを使用して、そのポートの接続を許可しますこれは機能しますが、自動化可能なソリューションではありません。jconsoleからVisualVMへのアップグレードを選択したのjstatd
は、実行中のポートを明示的に指定できるためです。VisualVMで、新しいリモートホストを追加し、上記で指定したものと相関する値で更新します。
次に、新しいリモートホスト接続を右クリックし、 Add JMX Connection...
のチェックボックスをオンにすることを忘れないでくださいDo not require SSL connection
。うまくいけば、これで接続できるはずです。
-Djava.rmi.server.hostname=localhost
-Dcom.sun.management.jmxremote.rmi.port=[...]
SSHを介してJMX / RMIをトンネリングする場合の鍵でもあります。これらがなければ、リモートオブジェクトは、ランダムポートを使用してサーバーのpublic / main / ... IPを使用してアクセスされますが、簡単に転送することはできません。
-Djava.rmi.server.hostname=0.0.0.0
DOCKER_HOST_IP
どこにでも-ちょうど使用I localhost
とドッキングウィンドウの画像の実行時にポートを転送:-p 9998:9998, -p 9999:9999
などを
最新のインカネーションのJava 6では、jconsoleは、JMXの呪文なしで起動された後でも、実行中のプロセスに接続することができます。
それが利用できる場合は、jvisualvmも検討してください。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を入力して、[ 接続 ]をクリックします。
-Dcom.sun.management.jmxremote.ssl=false
ですか?jconsole
エラーを表示する必要がありますか、それとも単に静かに接続できませんか?
以下のコマンドラインパラメータとともに、
-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サーバーから取得したIPアドレスに依存しないでください。ここで取得するIPは、ホストファイルに存在するマスクされたものです。
最初に、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接続にこのポートを使用できます。ここはポート1234
です。
sudo lsof -i:1234
は何も表示していません
ステップ1:次のパラメーターを使用してアプリケーションを実行します。
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
上記の引数は、アプリケーションをポート9999にバインドします。
手順2:コマンドプロンプトまたはターミナルでjconsoleコマンドを実行してjconsoleを起動します。
[リモートプロセス:]を選択し、URLを{IP_Address}:9999と入力し、[接続]ボタンをクリックしてリモートアプリケーションに接続します。
完全なアプリケーションについては、このリンクを参照できます。
私はこの正確な問題を抱えており、正しい設定をテストして把握するためのGitHubプロジェクトを作成しました。
これには、Dockerfile
サポートするスクリプトの操作、および簡単docker-compose.yml
なテストのためのシンプルな機能が含まれています。