hi 大家好,今天飞测团队给大家带来一篇性能测试中java程序cpu耗时分析的技巧,希望对大家有帮助,有疑惑或者错误,欢迎交流和指正。
1概述
对java程序进行性能压测时,经常会出现cpu资源使用高,甚至资源不释放的情况。对于这类性能问题,可以通过jdk自带工具jvm去定位到cpu耗时较高的热点方法,下面就为大家详细介绍如何使用jvm去定位cpu耗时。
2连接jvm
1 开启jvm远程配置
通常连接方式是本地远程访问服务器的java虚拟机。下面以tomcat为例
进入tomat/bin目录,编辑catalina.sh文件,找到JAVA_OPTS,加入以下内容:
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.port=1085 -Dcom.sun.management.jmxremote
2 打开jvm可视化工具进行连接
进入jdk/bin目录,双击jvisualvm.exe

添加远程主机ip,点击“确认”

添加jmx连接ip:jvm port,点击“确认”。端口为com.sun.management.jmxremote.port=1085

3Jvm cpu耗时分析
进入抽样器页签,点击“CPU”按钮。Jvm会实时打印耗cpu热点方法,按照从大到小进行排序

点击“快照”按钮,生成nps的快照文件。快照会以线程为单位,将每个线程方法以调用树的形式展现出来。使用例子作为具体讲解:
1. 首先让调用树以时间(cpu)倒序排列

2. 找到应用线程(排除系统线程),按照时间一层层递归调用,最终找出最耗时的方法。
从下面截图可以看到,选取排序中第一个应用线程pool-1-thread-2,一层层展开调用数并结合。最后定位到getJedis方法自调用占用cpu时间达到90%,提给开发gg优化即可,是不是很简单
3. getJedis方法主要进行redis计数操作,每调用一次接口,程序会连接redis并做一次+1的逻辑,该方法占用cpu耗时90%。开发需要排查这段代码是否有性能问题,或者redis配置能否优化
坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注、转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是我们期待的方向,有更多兴趣的欢迎切磋,我们微信订阅号,联系方式如下:
推荐文章