Отладка подключения JConsole
У меня есть веб-приложение, развернутое на удаленном смоляном сервере, и у него включен JMX.
Я могу установить telnet на удаленный сервер i.e
[email protected]:/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)
Есть ли у вас какая-либо идея относительно того, как отлаживать это (например, выяснить, что не так)?
Ответы
Ответ 1
Убедитесь, что вы запускаете свое приложение со следующими настройками 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
, откроется окно со списком журналов.
Ответ 2
Если вы запустите jconsole -debug, это даст вам больше информации о диагностике при сбое. ссылка:
http://blogs.oracle.com/jmxetc/entry/troubleshooting_connection_problems_in_jconsole
Я сделал это, и это показало мне, что я использовал 32-битную jconsole, когда они были запущены с другим 64-битным jvm, поэтому, по-видимому, это не разрешено, и он терпел неудачу.
Ответ 3
Это, наконец, заставило меня работать для меня: Предоставляя эту дополнительную опцию: -Djava.rmi.server.hostname=<ip addres where jvm is running
Итак, все аргументы vm, используемые для открытия jconsole с удаленной машины, 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>
Весь процесс указан здесь
Ответ 4
Я столкнулся с той же проблемой при запуске Java-процесса через cygwin. JConsole не может подключиться. Начал работу с win7-cmd, все работает так, как ожидалось.
Ответ 5
Я не знаю, полезно ли это, но, возможно, вы должны использовать двоичный файл jconsole в каталоге bin JDK, а не использовать недокументированное (и подлежащее изменению) солнце. * классы для запуска консоли
Ответ 6
Если ваше приложение работает на JDK 1.6, вы можете его подключить. Если он использует JDK до 1.6, запустите его, указав следующий аргумент JVM
-Dcom.sun.management.jmxremote
Ответ 7
У меня была аналогичная проблема с тем, что удаленный компьютер находился за брандмауэром, а брандмауэр блокировал порты, определенные -Dcom.sun.management.jmxremote.port
и RMI 46924
. После того, как я разрешил мне подключиться к этому порту, я успешно подключился.