Java后端开发性能优化排查思路及工具

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中的代码也已经预编译和优化。

相关推荐
考虑考虑9 小时前
Mybatis实现批量插入
java·后端·mybatis
咖啡八杯10 小时前
GoF设计模式——中介者模式
java·后端·spring·设计模式
青石路14 小时前
记一次多JDK版本问题的排查,一坑套一坑,差点没爬上来
java
像我这样帅的人丶你还17 小时前
Java 后端详解(五):Redis 缓存
java·后端·全栈
plainGeekDev19 小时前
GreenDAO → Room
android·java·kotlin
亦暖筑序1 天前
Java 8老系统AI Workflow实战:把一次性AI对话升级成可恢复工作流
java·后端
敲代码的彭于晏1 天前
Bean 生命周期完全图解:前端同学也能看懂的 Spring 核心机制
java·前端·后端
plainGeekDev1 天前
ButterKnife → ViewBinding
android·java·kotlin
像我这样帅的人丶你还2 天前
Java 后端详解(四):分页与搜索
java·javascript·后端
她的男孩2 天前
数据权限为什么不能只靠注解?Forge 的 Mapper 层 SQL 改写源码拆解
java·后端·架构