Java后端开发性能优化排查思路及工具
性能优化排查工具
JFR及cpu火焰图
Java Flight Record 提供一个低开销的数据收集框架,用于对 Java 应用程序和 HotSpot JVM 进行故障排除。Flight Recorder 记录源自应用程序、JVM和操作系统的事件
使用async-profiler,https://github.com/async-profiler/async-profiler,可以很方便获取火焰图和jfr。
将获取到的jfr文件,使用jdk mission control工具打开,可以获取类似下图的分析结果。

async-profiler获得cpu火焰图后,火焰图展示方法级别的响应时长,便于定位耗时较长的具体方法。
arthas
Arthas (https://arthas.aliyun.com/doc/commands.html) 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
使用arthas的trace - 方法内部调用路径,并输出方法路径上的每个节点上耗时。
性能优化思路点
| 排查方向 | 影响级别 | 原因 | 改进思路 | 改进后提升 | 备注 |
|---|---|---|---|---|---|
| 存在第三方dubbo、http等需要网络传输的接口的调用 | 大 | 缓存 | 大 | 需注意缓存击穿、穿透、雪崩问题 | |
| 剔出循环、递归 | 大 | ||||
| 线程并发 | 大 | 需注意并发问题 | |||
| 更改为redis、mysql等方式传输 | 大 | ||||
| 数据库,慢查询、连接池等 | 大 | 优化数据库查询语句 | 大 | ||
| 减少数据库连接次数,如使用批插入等 | 较大 | ||||
| IO操作 | 大 | 缓存 | 大 | 需注意缓存击穿、穿透、雪崩问题 | |
| 线程并发 | 大 | 需注意并发问题 | |||
| nio | 大 | ||||
| 深层递归 | 大 | 改为循环 | 较大 | ||
| xml、json、beanutils等反射、反序列化 | 大 | 底层都会执行反射 | 减少不必要字段 | 较大 | |
| 使用mapstruct代替beanutils.beancopy | 较大 | ||||
| 使用Protobuf、Kryo等代替json | 较大 | ||||
| 资源竞争 | 大 | 拆解死锁,使用超时机制 | 巨大 | ||
| 减少锁竞争,减小锁范围 | 较大 | ||||
| 频繁GC | 略小 | 减少重复对象创建 | 略小 | ||
| 切换GC算法 | 小 | ||||
| Stream流 | 略小 | Stream中会对迭代器中的对象进行copy | 使用for循环代替,减少copy次数 | 略小 | |
| List等迭代器遍历 | 略小 | 对不会重复的,使用set等哈希代替 | 略小 |
冷启动------首次请求延迟
JIT编译器在执行时即时编译字节码到机器代码,从而提高程序的运行效率。对于热点代码,可以在上线前先预热,确保JIT已经编译和优化这些代码。
对于使用了网络的接口调用,有时也需要预热,确保tomcat中的代码也已经预编译和优化。