web-dev-qa-db-ja.com

JConsole接続のデバッグに失敗しました

リモートレジンサーバーにデプロイされたWebアプリケーションがあり、JMXがオンになっています。

リモートサーバーにtelnetで接続できます。

franz@see:/tmp$ telnet <remote-ip> 5555
Trying <remote-ip>...
Connected to <remote-ip>.
Escape character is '^]'.
��sr5javax.management.remote.message.HandshakeBeginMessage�,���6profilestLjava/lang/String;Lversionq~xppt1.0^]

telnet> q
Connection closed.

JConsoleを使用して接続できない

$Java_HOME/bin/Java -cp $Java_HOME/lib/jconsole.jar:$Java_HOME/lib/tools.jar:pm-common/lib/jmxremote_optional-1_0_1_3.jar Sun.tools.jconsole.JConsole service:jmx:jmxmp://<remote-ip>:5555

私は次のJavaバージョンでこれを試しましたが、両方のインスタンスで「接続失敗」が表示されます。

## where Java_HOME=/opt/Java/64/jdk1.5.0_22
Java version "1.5.0_22"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_22-b03)
Java HotSpot(TM) 64-Bit Server VM (build 1.5.0_22-b03, mixed mode)

## where Java_HOME=/opt/Java/64/jdk1.6.0_17
Java version "1.6.0_17"
Java(TM) SE Runtime Environment (build 1.6.0_17-b04)
Java HotSpot(TM) 64-Bit Server VM (build 14.3-b01, mixed mode)

これをデバッグする方法について何か考えがありますか(つまり、何が問題かを調べます)?

23
Franz See

次のJavaプロパティを設定して、アプリケーションを実行していることを確認してください

-Dcom.Sun.management.jmxremote.port=9005
-Dcom.Sun.management.jmxremote.authenticate=false
-Dcom.Sun.management.jmxremote.ssl=false

今すぐ接続してみてください。これをデバッグしたい場合は、次のコマンドでjconsoleを実行できます

jconsole -J-Djava.util.logging.config.file=path_to_logging.properties_for_jconsole

以下は、logging.propertiesファイルの内容です。

Logging.properties

handlers = Java.util.logging.ConsoleHandler


.level = INFO

Java.util.logging.ConsoleHandler.level = FINEST

Java.util.logging.ConsoleHandler.formatter = \

Java.util.logging.SimpleFormatter

// Use FINER or FINEST for javax.management.remote.level - FINEST is

// very verbose...

javax.management.level = FINEST

javax.management.remote.level = FINER

jconsoleを実行すると、ログを表示する別のウィンドウがポップアップします。

36
samarth

jconsole -debugを実行すると、失敗に関する詳細な診断情報が得られます。 Daniel Fuchsブログエントリ「JConsoleでの接続問題のトラブルシューティング」 を参照してください。

これを行ったところ、32ビットのjconsoleを使用していて、ターゲットプロセスが別の(64ビット)jvmで開始されていることがわかりました。そのため、これは許可されていないため、失敗しました.

22
rogerdpack

これは最終的に私のためにそれを機能させました:この追加オプションを与える:-Djava.rmi.server.hostname=<ip addres where jvm is running

したがって、リモートマシンからjconsoleを開くために使用されるすべてのvm引数、リモートマシン上のjvmは

 -Dcom.Sun.management.jmxremote.authenticate=false  -Dcom.Sun.management.jmxremote.port=<port> -Dcom.Sun.management.jmxremote -com.Sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=<ip address>

プロセス全体がリストされています ここ

10
Lavixu

Cygwinを介してJava-Processを開始するときに、同じ問題が発生しました。 JConsoleが接続できません。 win7-cmdを使用して開始すると、すべてが期待どおりに機能します。

3
Stephan

これが役立つかどうかはわかりませんが、おそらく、ドキュメント化されていない(変更される可能性のある)Sun. *クラスを使用してコンソールを起動するのではなく、JDK binディレクトリのjconsoleバイナリを使用する必要があります。

1
qwerty

リモートマシンがファイアウォールの背後にあり、ファイアウォールが-Dcom.Sun.management.jmxremote.portおよびRMI 46924で定義されたポートをブロックしていたという同様の問題がありました。これらのポートに接続できるようにした後、接続に成功しました。

1
Ahmet Karakaya

アプリケーションがJDK 1.6で実行されているであれば、接続できるはずです。 1.6より前のJDKを使用している場合は、次のJVM引数を指定して実行します。

-Dcom.Sun.management.jmxremote

1
GuruKulki

ファイアウォールの背後にあるマシンにアクセスしている場合は、JMXポートとRMIポートの両方を開く必要があります。
このコンテキストでは、自動割り当てに依存するよりも、RMIの値を強制する方がはるかに優れています。
私の場合、Tomcatにアクセスしようとしていたため、次のことを行う必要がありました。

#!/bin/sh
CATALINA_OPTS="$CATALINA_OPTS -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Addresses=true -Dcom.Sun.management.jmxremote -Dcom.Sun.management.jmxremote.port=8008 -Dcom.Sun.management.jmxremote.rmi.port=8007 -Dcom.Sun.
management.jmxremote.ssl=false -Dcom.Sun.management.jmxremote.authenticate=false"

その後

firewall-cmd --zone=public --add-port=8008/tcp --permanent
firewall-cmd --zone=public --add-port=8007/tcp --permanent
firewall-cmd --reload
0
MonoThreaded