利用VisualVm和JMX远程监控Java进程

4次阅读

共计 1385 个字符,预计需要花费 4 分钟才能阅读完成。

原文地址
在前一篇文章里我们发现通过 jstatd + VisualVm 的方式,不能获得 Java 进程的 CPU、线程、MBean 信息,这时 JMX 就要登场了。
自 Java 6 开始,Java 程序启动时都会在 JVM 内部启动一个 JMX agent,JMX agent 会启动一个 MBean server 组件,把 MBeans(Java 平台标准的 MBean + 你自己创建的 MBean)注册到它里面,然后暴露给 JMX client 管理。简单来说就是每个 Java 程序都可以通过 JMX 来被 JMX client 管理,而且这一切都是自动发生的。而 VisualVm 就是一个 JMX Client。
VisualVm 能够自动发现本机的 Java 进程,如果要监控远程主机上的 Java 进程则需要显式地配置 JMX 连接,下面讲配置方法:
第一步:已经用 jstatd 连接了远程主机
已经根据利用 VisualVm 远程监控 Java 进程里的方法在 VisualVm 里添加了远程主机。
PS. 在实际使用过程中这个似乎不是必须的,但是如果不做,有些信息就会获取不到,因此还是做一下吧。
第二步:与启动相关的 System Properties
要给远程主机上的监控的 Java 进程在启动时必须带上几个 JMX 相关的 System Properties(常用的几个):

com.sun.management.jmxremote.port, 指定暴露的 JMX 端口。

com.sun.management.jmxremote.ssl, 指定是否使用 SSL,在开发环境下可以是 false,但是在生产环境下强烈建议为 true。

com.sun.management.jmxremote.authenticate, 指定是否需要密码才能够创建 JMX 连接。

为了演示目的,我们用 Tomcat 来测试,不开启 ssl 和 authenticate,把 JMX 端口设置为 1100,执行下列命令启动 Tomcat:
CATALINA_OPTS=’-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=1100 -Djava.rmi.server.hostname=k8s-oracle’ bin/startup.sh
注意上面有一个 -Djava.rmi.server.hostname=k8s-oracle 参数,JMX agent 本质上也是一个 RMI server,因此需要指定这个参数,否则就会像利用 VisualVm 远程监控 Java 进程里提到的一样,VisualVm 无法连接到该 Java 进程。
PS. 使用 SSL 方式保护 JMX 连接的方法会另写文章说明。
第三步:创建 JMX 连接
在远程主机上右键,选择添加 JMX 连接(在下图里出现了之前启动的 Tomcat 进程):

根据 Java 进程启动时设置的 JMX System Properties 配置 JMX 连接:

成功后你会发现多了一个进程,小图标上有 JMX 字样:

双击这个进程,你就能看到 CPU、线程、还有 MBeans 了。
参考资料

VisualVm – Connecting to JMX Agents Explicitly
Using JMX Agents
MBeans Tab

正文完
 0