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

原文地址html

前一篇文章里咱们发现经过jstatd + VisualVm的方式,不能得到Java进程的CPU、线程、MBean信息,这时JMX就要登场了。java

自Java 6开始,Java程序启动时都会在JVM内部启动一个JMX agent,JMX agent会启动一个MBean server组件,把MBeans(Java平台标准的MBean + 你本身建立的MBean)注册到它里面,而后暴露给JMX client管理。简单来讲就是每一个Java程序均可以经过JMX来被JMX client管理,并且这一切都是自动发生的。而VisualVm就是一个JMX Client。git

VisualVm可以自动发现本机的Java进程,若是要监控远程主机上的Java进程则须要显式地配置JMX链接,下面讲配置方法:github

第一步:已经用jstatd链接了远程主机

已经根据利用VisualVm远程监控Java进程里的方法在VisualVm里添加了远程主机。segmentfault

PS. 在实际使用过程当中这个彷佛不是必须的,可是若是不作,有些信息就会获取不到,所以仍是作一下吧。bash

第二步:与启动相关的System Properties

要给远程主机上的监控的Java进程在启动时必须带上几个JMX相关的System Properties(经常使用的几个):oracle

  • com.sun.management.jmxremote.port, 指定暴露的JMX端口。
  • com.sun.management.jmxremote.rmi.port, 指定RMI connector端口,能够和com.sun.management.jmxremote.port保持一致。
  • com.sun.management.jmxremote.ssl, 指定是否使用SSL,在开发环境下能够是false,可是在生产环境下强烈建议为true。
  • com.sun.management.jmxremote.authenticate, 指定是否须要密码才可以建立JMX链接。

为了演示目的,咱们用Tomcat来测试,不开启ssl和authenticate,把JMX端口设置为1100,执行下列命令启动Tomcat:ide

CATALINA_OPTS='-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=1100 -Dcom.sun.management.jmxremote.rmi.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进程。post

PS. 使用SSL方式保护JMX链接的方法会另写文章说明。测试

第三步:建立JMX链接

在远程主机上右键,选择添加JMX链接(在下图里出现了以前启动的Tomcat进程):

图片描述

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

图片描述

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

图片描述

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

可是Visual GC没有内容

使用上面的步骤创建完JMX链接以后,你会发现Visual GC没有内容:

图片描述

解决办法要启动jstatd。

按照利用VisualVm远程监控Java进程的方法先创建远程主机。

给这个远程主机添加JMX链接:

图片描述

图片描述

而后你会发现多了一个JMX图标的Java进程:

图片描述

在这个进程里就能看到Visual GC了。

图片描述

参考资料

相关文章
相关标签/搜索