Просмотр MBeans через jstatd
Я пытаюсь контролировать все процессы Java, запущенные на сервере через jstatd. У меня достаточно настроено, чтобы я мог соединиться с VisualVM и увидеть все запущенные процессы. Большинство дисплеев работают нормально, однако некоторые вещи (особенно загрузка ЦП и MBeans) не отображаются. Вместо этого он говорит:
MBeans Browser
Данные недоступны, так как не удалось установить соединение JMX с агентом JMX.
Я предположил, что проблема заключалась в том, что приложение должно "объявить" через jstatd
Реестр RMI, а не локальный, поэтому я опробовал следующее (согласно этим предложениям), но он все равно не будет отображаться. Код, который я попробовал, выглядит следующим образом:
public class JmxRmiConnectorTest {
public static void main(String[] args) throws Exception {
Registry rmiRegistry = LocateRegistry.createRegistry(9994);
String svc =
"service:jmx:rmi://localhost:9994/jndi/rmi://localhost:1099/connector";
MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
JMXServiceURL url = new JMXServiceURL(svc);
RMIConnectorServer rmiServer = new RMIConnectorServer(url, null, mbeanServer);
rmiServer.start();
Thread.sleep(100000);
rmiServer.stop();
}
}
Как я могу заставить мои MBeans и использование ЦП отображаться в VisualVM при просмотре через jstatd?
3 ответа
Jstatd не имеет ничего общего с JMX. Jstatd является прокси для Jvmstat. Чтобы получить MBeans и использование процессора, вам также нужно включить JMX. См. JMX Remote Monitoring and Management для более подробной информации. Как только вы включите JMX, VisualVM автоматически обнаружит (через jvmstat), что он также может использовать JMX, и будет отображать данные из jvmstat и JMX в одном месте.
В удаленном режиме, запустите java, как это, чтобы enabl jmxremote.
java -Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=9191 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname=`hostname` \
-jar app.jar
В локали используйте jps вот такjps YOUHOSTNAME:9191
,
Как раз для тех, кому нужен быстрый метод работы.JMX можно запускать/останавливать динамически, без перезапуска JVM. В моем случае после динамического запуска jmx и перезапуска jvisualvm использование JMX и процессора работает нормально.
jcmd PID ManagementAgent.start jmxremote.port=9999 jmxremote.ssl=false jmxremote.authenticate=false
или же
jcmd PID ManagementAgent.stop