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


223

jconsoleを使用してアクセスするためにJVMでJMXをアクティブにする方法


32
それは許可されており、実際にはそれは私にとってリマインダーにすぎません。なぜなら、どこからパラメーターをコピーするかを常に忘れ、今どこにあるかを知っているからです:-)
Mauli

20
Stack Exchangeは常にユーザーに自分の質問に答えるよう明示的に推奨してきました。こちらをご覧ください:stackoverflow.com/help/self-answer
TimBütheJun

11
SOで何かを検索したところ、自分で回答した質問が見つかりました。そしてそのうちの1つも私から尋ねられました。これが、あなた自身の答えを入れるのが良い理由です。また、あなたの問題に遭遇したかもしれない他のすべての人々について考えてください。あなたの質問に答えれば、あなたも彼らを助けます。
Mike Miller

2
Java 8の更新されたドキュメントはこちら
Andrew Johnston、

@モーレン:自分で回答した閉じた質問への参照を提供できますか?メタについて議論する価値があるかもしれません。
kevinarpe 2015年

回答:


290

関連ドキュメントはここにあります:

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


9
CentOSでも-Dcom.sun.management.jmxremote.local.only = falseが必要になりました
LenW

1
Nit pick:com.sun.management.jmxremoteデフォルト値がであるのは私には奇妙ですtrue。(あなたの日をありがとう!)スーパー明確にするため、JMXのNOBSとあまり馴染みのものは、私が使用し、特にに:com.sun.management.jmxremote=true参考:docs.oracle.com/javase/8/docs/technotes/guides/management/...
kevinarpe

1
「-Djava.rmi.server.hostname」は、私にとっては魅力的なものでした。
Orhun D.

1
ホスト名をlocalhostに設定することは、SSHトンネルを介してをリモートサーバーに接続する場合に非常に重要です。これは非常に一般的なケースです。
Nikhil Owalekar 2017

1
これは、サーバーのファイアウォールを無効にした場合にのみ機能します。もちろん、この例ではポート9010 / tcp Dcom.sun.management.jmxremote.rmi.port=9011を開きました。ファイアウォールで追加して開くことも試みましたが、ファイアウォールが稼働している状態では接続できません。何かご意見は?何か逃したことがありますか?
Carmageddon 2018

70

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...

JMX接続を追加

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


-Djava.rmi.server.hostname=localhost -Dcom.sun.management.jmxremote.rmi.port=[...]SSHを介してJMX / RMIをトンネリングする場合の鍵でもあります。これらがなければ、リモートオブジェクトは、ランダムポートを使用してサーバーのpublic / main / ... IPを使用してアクセスされますが、簡単に転送することはできません。
ThorstenSchöning19年

1
コンテナIPの外部を本当に使用する必要があることを確認できました。たとえば、それは動作しません-Djava.rmi.server.hostname=0.0.0.0
レイザーコストイン

私が使用する必要はありませんでしたDOCKER_HOST_IPどこにでも-ちょうど使用I localhostとドッキングウィンドウの画像の実行時にポートを転送:-p 9998:9998, -p 9999:9999などを
バーニー

9

最新のインカネーションのJava 6では、jconsoleは、JMXの呪文なしで起動された後でも、実行中のプロセスに接続することができます。

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


3
これは、監視するJVMと同じホストでjconsoleを実行している場合にのみ機能します。
グレー:

1
@ ThorbjornパラメータなしでJavaプログラムを起動し、jconsoleで接続しようとすると、リストにプログラムが表示されますが、接続しようとすると失敗します。SSL証明書がないためだと思います。私はただデモを見たかったので、user3013578の回答で指定されたパラメーターを使用する必要があり、それは私のために機能しました(JDK 1.7、Windows 8.1、64ビット)。
ジャック・スパロウ船長

2
アタッチAPIには、一部のプラットフォームで起動されたプログラムと同じ32/64ビットJVMがjconsoleに必要です。
–ThorbjørnRavn Andersen 2015

1
この動作を無効にすることは可能ですか?
kevinarpe 2015年

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

はい、あなたの答えは私にとってうまくいきました(JDK 1.7、windows 8.1 64ビット)
キャプテンジャックスパロウ

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


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を入力して、[ 接続 ]をクリックします


忘れた場合の予想される動作は何-Dcom.sun.management.jmxremote.ssl=falseですか?jconsoleエラーを表示する必要がありますか、それとも単に静かに接続できませんか?
amacleod 2014年

2

以下のコマンドラインパラメータとともに、

-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は、ホストファイルに存在するマスクされたものです。


1

最初に、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です。


これを実行すると、jmxが使用しているポート1234を確認できますか?sudo lsof -i:1234は何も表示していません
Gorgon_Union '30 / 10/30

1

ステップ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と入力し、[接続]ボタンをクリックしてリモートアプリケーションに接続します。

完全なアプリケーションについては、このリンクを参照できます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.