Как активировать JMX на моей JVM для доступа через jconsole? - PullRequest
192 голосов
/ 13 мая 2009

Как активировать JMX на JVM для доступа через jconsole?

Ответы [ 9 ]

260 голосов
/ 13 мая 2009

Соответствующую документацию можно найти здесь:

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

54 голосов
/ 18 ноября 2016

Запуск в контейнере 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} на разрешаемый извне IP (DNS-имя) вашего хоста Docker.

Порты JMX Remote и RMI

Похоже, JMX также требуется доступ к интерфейсу удаленного управления ( jstat ), который использует другой порт для передачи некоторых данных при арбитраже соединения. Я не видел нигде сразу очевидного в jconsole, чтобы установить это значение. В связанной статье процесс был:

  • Попробуйте подключиться с jconsole с включенным ведением журнала
  • Сбой
  • Выясните, какой порт jconsole пытался использовать
  • При необходимости используйте правила iptables / firewall, чтобы разрешить подключение этого порта

Хотя это работает, это, конечно, не автоматизируемое решение. Я выбрал обновление с jconsole до VisualVM , поскольку оно позволяет вам явно указать порт, на котором работает jstatd. В VisualVM добавьте новый удаленный хост и обновите его значениями, соответствующими указанным выше:

Add Remote Host

Затем щелкните правой кнопкой мыши новое подключение к удаленному хосту и Add JMX Connection...

Add JMX Connection

Не забудьте установить флажок для Do not require SSL connection. Надеюсь, это позволит вам подключиться.

9 голосов
/ 13 мая 2009

Обратите внимание, что Java 6 в последней версии позволяет jconsole присоединяться к работающему процессу даже после его запуска без использования JMX.

Если это доступно вам, также рассмотрите jvisualvm, поскольку он предоставляет обширную информацию о запущенных процессах, включая профилировщик.

7 голосов
/ 20 ноября 2013

Я использую 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
6 голосов
/ 18 апреля 2014

В 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, чтобы имя хоста разрешалось по адресу хоста (192.168.0.x), а не по адресу обратной связи (127.0.0.1)

2 голосов
/ 12 мая 2012

Запустите ваше Java-приложение со следующими параметрами командной строки:

-Dcom.sun.management.jmxremote.port=8855
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

Важно использовать параметр -Dcom.sun.management.jmxremote.ssl = false , если вы не хотите настраивать цифровые сертификаты на хосте jmx.

Если вы запустили приложение на компьютере с IP-адресом 192.168.0.1 , откройте jconsole , укажите 192.168.0.1: 8855 в Удаленный процесс и нажмите Подключить .

1 голос
/ 30 ноября 2018

вместе с указанными ниже параметрами командной строки,

-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

Иногда на серверах linux соединение imx не устанавливается. Это связано с тем, что в облачном хосте Linux, в / etc / hosts, чтобы имя хоста соответствовало адресу хоста.

лучший способ исправить это - пропинговать конкретный сервер linux с другого компьютера в сети и использовать этот IP-адрес хоста в

-Djava.rmi.server.hostname=IP address that obtained when you ping that linux server.

Но никогда не полагайтесь на IP-адрес, полученный с сервера Linux с помощью ifconfig.me. ip, который вы получаете там, является замаскированным, который присутствует в файле хоста.

0 голосов
/ 31 января 2019

Сначала вам нужно проверить, работает ли ваш 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.

0 голосов
/ 23 марта 2017

У меня была именно эта проблема, и создал проект GitHub для тестирования и определения правильных настроек .

Он содержит рабочий Dockerfile с поддерживающими скриптами и простой docker-compose.yml для быстрого тестирования.

...