web-dev-qa-db-ja.com

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

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

192
Mauli

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

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

260
Mauli

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 )へのアクセスも必要とするようです。この値を設定するためのjconsolename__ですぐにわかる場所はありませんでした。リンクされた記事では、プロセスは次のとおりでした。

  • ロギングを有効にしてjconsolename__から接続してみてください
  • Fail
  • どのポートjconsolename__が使用を試みたかを把握する
  • 必要に応じてiptablesname __/firewallname__ルールを使用して、そのポートが接続できるようにします

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

Add Remote Host

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

Add JMX Connection

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

54
Joel B

最新のインカネーションの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
7
user3013578

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を編集しました

6
alex.pulver

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

2
Wasif

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

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

1
Phani Kumar

私はこの正確な問題を抱えていましたが、 正しい設定をテストして理解するためのGitHubプロジェクトを作成しました

これには、サポートスクリプトを含む有効なDockerfileと、簡単なテストのための単純なdocker-compose.ymlが含まれています。

0
cstroe

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

0
Abhay S