一、前言
我所在微服务有一个OCR功能快上线,但是压测的时候测试说CPU占用率太高了,喊我改代码。所以简单学了下性能监测工具的使用。
稍微有点经验的开发都应该知道linux下监控性能的命令非常多,常见的举例:
top# 按住 shift + M 可按内存大小排序# 按住 shift + P 可按CPU占用率大小排序

如果想要查看某个进程的具体线程的状态,则使用
top -Hp 8091# 8091是pid号# -H 是线程模式的意思# -p 指定pid

即可查看8091进程下所有线程的资源使用情况。因为信息是过眼云烟,没有进行可视化,所以可以使用JVisualVM工具进行更图形化的分析。
二、JVisualVM
服务器配置
服务器启动java进程时配置
-Djava.rmi.server.hostname=0.1.2.3-Dcom.sun.management.jmxremote-Dcom.sun.management.jmxremote.port=1099-Dcom.sun.management.jmxremote.authenticate=false-Dcom.sun.management.jmxremote.ssl=false
其中,0.1.2.3代表本机ip,1099代表开启的用于远程监听的本地端口号,authenticate=false代表不认证,ssl=false代表不适用ssl。
启动举例:
java-Djava.rmi.server.hostname=0.1.2.3 -Dcom.sun.management.jmxremote-Dcom.sun.management.jmxremote.port=1099-Dcom.sun.management.jmxremote.authenticate=false-Dcom.sun.management.jmxremote.ssl=false-jarxxxxx.jar
这样就在服务器开启了1099不认证端口,用于性能检测使用。
JVisualVM
JVisualVM是JDK自带的性能检测工具,路径在%JAVA_HOME%/bin下面。双击打开,
添加远程主机:
添加远程主机

打开JMX连接:


点击进行监测数据:


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

点击线程即可当前进程所有的线程,右下角根据不同的颜色可以区分线程的不同状态,但是个人认为驻留和监视这两个颜色太像了,没办法区分,没找到换颜色的地方。
四、热点函数分析
点击抽样器,点击cpu可对cpu抽样,但是我不太理解自用时间和自用时间(CPU)这两个有什么区别,是不是自用时间是总共花费时间(包含当前线程运行、阻塞等状态),而自用时间(CPU)是线程在运行态的时间。*_求评论大佬解答。_

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