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

相关推荐
程序员黑豆3 小时前
Java 注释详解:单行、多行与文档注释的完整指南
java·前端·ai编程
hey_sml5 小时前
JAVA每日一学---CompletableFuture中thenApply与thenCompose区别详解
java·开发语言
Doraemomo5 小时前
数据结构-环形链表
java·数据结构·链表
萧瑟余晖6 小时前
Java深入解析篇十七之SpringCloud
java·开发语言
是未才7 小时前
从输入 URL 到页面返回:DNS、路由、TLS 与 HTTP 完整链路
java·后端·计算机网络
ttod_qzstudio7 小时前
Java 常用语法极简通关(五):类与对象——字段、方法、构造器、this 与 static
java·开发语言·python
萧瑟余晖8 小时前
Java深入解析篇十七之Spring Security
java·开发语言·spring
灯澜忆梦8 小时前
【MySQL10】进阶篇 | 索引_#2性能优化
数据库·sql·mysql·性能优化
不老刘9 小时前
【Java入门】Java服务部署方式全景对比:从java -jar到K8s
java·kubernetes·jar
离陌在学C#11 小时前
C# 重载与重写:深入理解面向对象编程的核心概念
java·c#