1. 为什么需要性能监控?
有时我们会发现Java程序在运行一段时间之后速度会变慢,导致变慢的原因有很多,比如数据库延迟太高,线程死锁,频繁的Full GC等等。通常遇到这种情况时,我们可以通过top或htop命令查看Java进程的CPU和内存的占用情况,但是无法准确的找出系统变慢的原因。这时我们就需要一种方式可以实时的查看Java虚拟机的运行情况,进而发现系统变慢的原因。本文将介绍如何通过JMX进行Java性能的远程监视。
2. 什么是JMX?
JMX(Java Management Extensions)是在Java5中提出的一个Java系统管理和监控的标准,目前最新的版本是1.4,发布于2006年11月9日。JMX的目标是为开发者提供一个框架,基于该框架可以很容易地开发一套功能强大的Java虚拟机管理系统。
3. 如何开启JMX?
为了保证系统的安全性,JMX提供了两种认证方式,一种是基于密码的认证,另一种是基于SSL证书的认证。在开发环境下,可以暂时关闭认证,在生产环境下,可以根据需要选择密码方式或是SSL证书方式。
3.1 在开发模式下开启JMX
开发模式下要追求快速、高效,可以通过设置如下参数暂时关闭认证:
com.sun.management.jmxremote.authenticate=false
示例:
nohup ./play-app -J-Xmx1g -Dcom.sun.management.jmxremote.port=9900 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=HOST_NAME > ../log.txt&
其中9900是JMX监听端口,请HOST_NAME替换成运行Play应用的服务器主机名或IP地址。
3.2 在生产模式下开启JMX
生产模式下更加注重安全性,如无参数指定,JMX默认采用密码认证方式,用户列表和访问权限定义在如下两个文件中:
JRE_HOME/lib/management/jmxremote.passwordJRE_HOME/lib/management/jmxremote.access
如果jmxremote.password文件不存在,则从模板文件拷贝一份:
cp JRE_HOME/lib/management/jmxremote.password.template JRE_HOME/lib/management/jmxremote.password
编辑jmxremote.password文件,内容如下:
monitorRole 123456controlRole 123456
编辑jmxremote.access文件,内容如下:
monitorRole readonlycontrolRole readwrite
修改这两个文件的访问权限,否则启动时会报错:
chmod 600 jmxremote.passwordchmod 600 jmxremote.access
OK,准备工作做完了,使用下面命令启动Play应用:
nohup ./play-app -J-Xmx1g -Dcom.sun.management.jmxremote.port=9900 -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=HOST_NAME > ../log.txt&
4. 连接JMX开始监控
JDK内置了两个JMX客户端工具,分别是jconsole和jvisualvm,位于JDK的bin目录下。连接时请勾选“不要求SSL连接”,下面是jvisualvm连接成功后的截图: