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

相关推荐
三金1213813 小时前
Java定时任务Schedule详解及Cron表达式实践
java·开发语言
Coder_Boy_13 小时前
基于SpringAI的在线考试系统-数据库 表结构 & 完整外键依赖关系梳理
java·数据库·人工智能·软件工程
Wpa.wk13 小时前
性能测试 - 性能监控命令top,ps
java·经验分享·测试工具
Miss_Chenzr13 小时前
Springboot企业人事管理系统mi130(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·数据库·spring boot
豆沙沙包?14 小时前
2026年--Lc342-841. 钥匙和房间(图 - 广度优先搜索)--java版
java·算法·宽度优先
星火开发设计14 小时前
C++ 运算符全解析:算术、关系、逻辑与位运算
java·开发语言·c++·学习·位运算·知识·操作符
2401_8823515215 小时前
Flutter for OpenHarmony 商城App实战 - 购物车实现
java·flutter·dubbo
遇印记15 小时前
蓝桥java求最大公约数
java·开发语言
ONExiaobaijs15 小时前
【无标题】
java·开发语言·spring·maven·程序员创富
符哥200815 小时前
Mybatis和Mybatis-plus区别
java·开发语言·mybatis