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

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

7 ответов


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

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


запуск в контейнере 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. Надеюсь, это позволит вам соединиться.


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

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


Я использую был 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

в 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)


запустите приложение java со следующими параметрами командной строки:

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

важно использовать -Dcom.солнце.управление.jmxremote.протокол SSL=ложь параметр, если вы не хотите настраивать цифровые сертификаты на хосте jmx.

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


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

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