Java性能分析工具

2021-06-17 fishedee 后端

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);
input.next();

对于那些非长期运行的程序,我们要在程序底部加上这一句,避免程序过早结束而无法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

相关文章