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
打开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 许可协议,转载必须注明出处!