jvisualvm подключиться к удаленному jstatd не показывает приложения
Я начал jstatd
на удаленном сервере (Ubuntu Server 14.04):
jstatd -J-Djava.security.policy=.jstatd.all.policy -J-Djava.rmi.server.logCalltrue -p 9099
и попробуйте подключиться к нему с jvisualvm на окнах. Я проверил netstat
, соединение установлено, и на пульте он регистрирует вызов:
Sep 11, 2015 12:48:51 PM sun.rmi.server.UnicastServerRef logCall
FINER: RMI TCP Connection(4)-10.82.199.0: [10.82.199.0: sun.rmi.registry.RegistryImpl[0:0:0, 0]: java.rmi.Remote lookup(java.lang.String)]
Sep 11, 2015 12:48:55 PM sun.rmi.server.UnicastServerRef logCall
FINER: RMI TCP Connection(4)-10.82.199.0: [10.82.199.0: sun.rmi.registry.RegistryImpl[0:0:0, 0]: java.rmi.Remote lookup(java.lang.String)]
Sep 11, 2015 12:48:59 PM sun.rmi.server.UnicastServerRef logCall
FINER: RMI TCP Connection(4)-10.82.199.0: [10.82.199.0: sun.rmi.registry.RegistryImpl[0:0:0, 0]: java.rmi.Remote lookup(java.lang.String)]
Все признаки говорят, что это работает. но, тем не менее, никакие приложения не отображаются в jvisualvm:
2 ответа
Очевидно, VisualVM ожидает согласованного DNS-имени для сервера, к которому вы пытаетесь подключиться удаленно (Ubuntu Server 14.04 в вашем случае). Следовательно, если вы указываете IP-адрес вместо DNS-имени для VisualVM, вы должны добавить следующее в строку запуска jstatd:
-J-Djava.rmi.server.hostname=<the IP address to your Ubuntu server here>
Кроме того, я обнаружил, что указание параметра порта (-p 9099 в вашем случае) не поддерживается в некоторых выпусках VisualVM:
Известное ограничение: в этом выпуске VisualVM порт jstatd по умолчанию и порт rminame должны использоваться при запуске утилиты jstatd, т. Е. Использование параметров -p и -n не поддерживается. VisualVM Руководство по устранению неисправностей
В общем, вы должны попробовать запустить следующую строку jstatd на вашем сервере Ubuntu:
jstatd -J-Djava.security.policy=.jstatd.all.policy -J-Djava.rmi.server.hostname=10.82.83.117 -J-Djava.rmi.server.logCalltrue
Источники:
- http://www.catify.com/2012/09/26/remote-monitoring-with-visualvm/
- У меня это сработало:)
jstatd -p 1099 -J-Djava.rmi.sver.hostname=10.250.105.112 -J-Djava.security.policy=<(echo 'grant codebase "file:${java.home}/../lib/tools.jar" {permission java.security.AllPermission;};')
Работает для меня отлично
В java 11+
jstatd -J-Djava.rmi.server.logCalls=true \
-J-Djava.security.policy=.jstatd.all.policy \
-J-Djava.net.preferIPv4Stack=true \
-J-Djava.security.policy=<(echo 'grant codebase "jrt:/jdk.jstatd" {permission java.security.AllPermission;}; grant codebase "jrt:/jdk.internal.jvmstat" {permission java.security.AllPermission;};')
Если это поможет кому-то другому...
Я столкнулся с проблемами, когда ни jstatd
ни добавление простого JMX-соединения в VisualVM не работало. Первый не выдавал никаких сообщений об ошибках, просто не перечислял никаких приложений. Последнее даст мне сообщение об ошибке"Cannot connect to some-server:30648 using service:jmx:rmi:///jndi/rmi://some-server:30648/jmxrmi
.
Попытка использовать отличный инструмент sjk-plus для ручного подключения к службе JMX привела к следующей ошибке:
$ java --add-opens java.base/jdk.internal.perf=ALL-UNNAMED \
--add-opens jdk.attach/sun.tools.attach=ALL-UNNAMED \
-Dsjk.breakCage=false \
-jar scripts/sjk-plus-0.14.jar
mx --get --allMatched -b com.acme.some.package:name=* -f Count \
-s some-server:30648
JMX Connection failed: java.rmi.ConnectException: Connection refused to host: 127.0.1.1; nested exception is:
java.net.ConnectException: Connection refused (Connection refused)
Вы видите это? 127.0.1.1, что там делает этот странный IP-адрес?
Это было вызвано конкретной записью в /etc/hosts
файл на сервере:
user@some-server:~$ cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 some-server
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
Изменение some-server
запись в hosts
файл и перезапуск процесса заставил его работать с sjk-plus
и сделал его доступным для обнаружения с помощью jstatd
также.