0 概述
Java性能分析工具
性能分析之前需要注意:
- 先把日志模块关了,日志模块相当影响运行性能。
1 JProfiler
是Java下面最好的在线性能分析工具,它能很好地分析出系统的性能瓶颈在哪里
1.1 安装
L-Larry_Lau@163.com#23874-hrwpdp1sh1wrn#0620
L-Larry_Lau@163.com#36573-fdkscp15axjj6#25257
L-Larry_Lau@163.com#5481-ucjn4a16rvd98#6038
L-Larry_Lau@163.com#99016-hli5ay1ylizjj#27215
L-Larry_Lau@163.com#40775-3wle0g1uin5c1#0674
L-Larry_Lau@163.com#7009-14frku31ynzpfr#20176
L-Larry_Lau@163.com#49604-1jfe58we9gyb6#5814
L-Larry_Lau@163.com#25531-1qcev4yintqkj#23927
L-Larry_Lau@163.com#96496-1qsu1lb1jz7g8w#23479
L-Larry_Lau@163.com#20948-11amlvg181cw0p#171159
到官网这里下载JProfiler 9.2版本。JProfiler 9.2的注册码网上到处都有,随便用。但是到了JProfiler 10以后的版本就很难破解了,淘宝也没有办法。
然后在IDEA里面安装JProfiler插件
1.2 启动
1.2.1 新程序Profile
Scanner input = new Scanner(System.in);
.next(); input
对于那些非长期运行的程序,我们要在程序底部加上这一句,避免程序过早结束而无法Profile
然后在启动里面选择Profile App就可以了
1.2.2 已有程序Profile
选择Start Center
选择Quick Attach就可以绑定分析已经在运行的程序了
1.3 内存
在这里有一个内存泄漏分析的例子
进入Live Memory,我们看到:
- All Objects,当前的内存类型与大小
- Allocation Call Tree,内存分配是由哪个方法来触发的
- Allocation Hot Spots,哪个方法分配的内存最多
1.3.1 内存泄漏
先打开All Objects选项,然后选择Mark Current,就会设置当前的内存情况
对程序进行压力测试以后,选择Freeze View,然后点击Difference,就可以看到当前的内存情况。
正常情况下,没有GC的话就会有内存新增,红色条部分的新增的内存大小。
右键选择Show Selection In Heap Walker
进入Heap Walker方法,我们就能看到这个界面,我们再次选择Selected Instances
选择Incoming References分析
我们就能知道这个int[]对象是谁来引用它的,在Heap Walker我们得到了这个结果。
当然,这个方法并不能真的找到内存泄漏的位置,因为GC没有执行当然内存会增加,我们可以在压力测试以后,手动进行Run GC操作。然后去看哪些内存一直在内存中而没有去释放,就知道内存泄漏的地方在哪里了
1.3.2 内存分配瓶颈
选择Allocation Call Tree菜单,然后点击Record Memory按钮
进行压力测试以后,我们点击Stop Memory按钮和Calculate按钮
我们就能知道每个URL分配的内存数量
如果选择左侧的Allocation Hot Spots的按钮,它还会自动聚合不同的方法分配的内存数量
1.4 CPU
1.4.1 调用树设置
默认的JProfiler只对部分的函数进行分析,如果在后续分析发现不够详细的时候,可以通过新增分析调用树来增强需要分析的函数。
1.4.2 压测
打开CPU按钮,选择Record CPU
压力测试以后,选择Stop CPU
这个时候就能看到不同方法的执行时间了
我们还可以右键选择Show Call Graph
来图形展示CPU的瓶颈在哪里
1.5 JDBC
选择Record Probe JDBC按钮
经过压力分析以后,选择Stop Probe JDBC
然后再选择Call Tree,就能看到每个接口触发的SQL次数,以及这些SQL是什么内容
1.6 总结
JProfiler可以说是在线性能分析的不二之选,功能强大,图形界面方便。但是对于线上运行的服务器程序,JProfiler的性能损失(overhead)太大,不建议用。
线上运行的性能分析程序,我们建议用TProfiler来做性能分析,但是TProfiler在1.0版本以后就没有更新,不支持Spring Boot 2.0以后的版本,所以也不知道怎么做了。
2 Arthas
- 本文作者: fishedee
- 版权声明: 本博客所有文章均采用 CC BY-NC-SA 3.0 CN 许可协议,转载必须注明出处!