一、前言

我所在微服务有一个OCR功能快上线,但是压测的时候测试说CPU占用率太高了,喊我改代码。所以简单学了下性能监测工具的使用。

稍微有点经验的开发都应该知道linux下监控性能的命令非常多,常见的举例:

  1. top
  2. # 按住 shift + M 可按内存大小排序
  3. # 按住 shift + P 可按CPU占用率大小排序

必须要会的JVM性能监测工具(JVisualVM) - 图1

如果想要查看某个进程的具体线程的状态,则使用

  1. top -Hp 8091
  2. # 8091是pid号
  3. # -H 是线程模式的意思
  4. # -p 指定pid

必须要会的JVM性能监测工具(JVisualVM) - 图2

即可查看8091进程下所有线程的资源使用情况。因为信息是过眼云烟,没有进行可视化,所以可以使用JVisualVM工具进行更图形化的分析。

二、JVisualVM

服务器配置

服务器启动java进程时配置

  1. -Djava.rmi.server.hostname=0.1.2.3
  2. -Dcom.sun.management.jmxremote
  3. -Dcom.sun.management.jmxremote.port=1099
  4. -Dcom.sun.management.jmxremote.authenticate=false
  5. -Dcom.sun.management.jmxremote.ssl=false

其中,0.1.2.3代表本机ip,1099代表开启的用于远程监听的本地端口号,authenticate=false代表不认证,ssl=false代表不适用ssl。

启动举例:

  1. java
  2. -Djava.rmi.server.hostname=0.1.2.3 -Dcom.sun.management.jmxremote
  3. -Dcom.sun.management.jmxremote.port=1099
  4. -Dcom.sun.management.jmxremote.authenticate=false
  5. -Dcom.sun.management.jmxremote.ssl=false
  6. -jar
  7. xxxxx.jar

这样就在服务器开启了1099不认证端口,用于性能检测使用。

JVisualVM

JVisualVM是JDK自带的性能检测工具,路径在%JAVA_HOME%/bin下面。双击打开,

添加远程主机:

必须要会的JVM性能监测工具(JVisualVM) - 图3添加远程主机

必须要会的JVM性能监测工具(JVisualVM) - 图4

打开JMX连接:

必须要会的JVM性能监测工具(JVisualVM) - 图5

必须要会的JVM性能监测工具(JVisualVM) - 图6

点击进行监测数据:

必须要会的JVM性能监测工具(JVisualVM) - 图7

必须要会的JVM性能监测工具(JVisualVM) - 图8

图中可以看到cpu占用率,内存使用情况,线程数等等,

三、线程监视

必须要会的JVM性能监测工具(JVisualVM) - 图9

点击线程即可当前进程所有的线程,右下角根据不同的颜色可以区分线程的不同状态,但是个人认为驻留和监视这两个颜色太像了,没办法区分,没找到换颜色的地方。

四、热点函数分析

点击抽样器,点击cpu可对cpu抽样,但是我不太理解自用时间和自用时间(CPU)这两个有什么区别,是不是自用时间是总共花费时间(包含当前线程运行、阻塞等状态),而自用时间(CPU)是线程在运行态的时间。*_求评论大佬解答。_

必须要会的JVM性能监测工具(JVisualVM) - 图10

五、总结

JVisualVM功能非常强大,可以对堆内存进行dump、快照以及性能可视化分析,也可以安装插件对堆外内存进行分析(我用Buffer Pool),如果项目要求不是特别高,这一款工具已经足够强大加易用。但是也有缺点,据我所知,这些数据是通过RMI协议进行传输,而且监视那一栏采样时间是2S,可能采样精度不够高。