基于DevKit Java性能分析工具的调优实践——死锁问题
发表于 2025/12/29
0
1 调优概述
鲲鹏DevKit是一款提供涵盖迁移、测试、性能调优及系统诊断等各环节的开发使能工具集。其中,DevKit Java性能分析工具是针对基于鲲鹏的服务器上运行的Java程序的性能分析和优化工具,能图形化显示Java程序的堆、线程、锁、垃圾回收等信息,收集热点函数、定位程序瓶颈点,帮助用户采取针对性优化。本文使用Java性能优化工具对运行中的Java程序进行在线分析和采样分析,找到程序中的死锁问题,并根据分析结果进行优化修改,从而实现Java程序最佳运行。
2 环境要求
项目 | 说明 |
服务器 | TaiShan 200 服务器(型号2280) |
CPU | Kunpeng 920 |
OS | CentOS 7.6 |
调优工具 | Kunpeng DevKit Java性能分析工具 |
3 前提条件
- 服务器和操作系统正常运行。
- PC端已经安装SSH远程登录工具
- 需要优化的Java程序
4 调优思路
- 使用Java性能优化工具对Java进程进行在线分析;
- 使用Java性能优化工具对Java进程进行采样分析
- 针对性能的瓶颈点进行性能优化;
- 观察优化后的Java程序,判断问题是否解决
5 调优过程
5.1 对程序进行在线分析,在概览页签下观察每种状态的线程数
发现一直有两个线程处于阻塞状态,有死锁的嫌疑

5.2 切换到线程页签,搜索阻塞状态的线程
观察一段时间发现发两个线程一直处于阻塞状态,执行多次线程转储操作。

5.3 切换到锁分析图页签
发现两个阻塞中的线程发生了死锁

5.4 切换到线程转储页签
根据线程转储信息得到死锁的相关信息

5.5 发现问题并解决
根据线程转储提供的相关信息,搜索代码中的相关项,本案例的 demo 比较简单,
可以看到程序的确发生了死锁,根据实际情况进行修改。
本demo 是因为两个线程持有锁的顺序不当导致

修改后的代码:

5.6 程序优化后
调整两个线程持有锁的顺序后,程序不再发生死锁。


6 实践总结
Java中的死锁问题一旦发生很难定位具体的代码位置,因为程序干扰因素比较多,所以涉及加锁解锁逻辑的地方一定要仔细。建议如果涉及加锁的代码逻辑,程序是通过新起线程去执行或者是在线程池中执行,一定要给线程设置有特定业务逻辑的名称,一旦发生问题也好定位。
在进行其他程序调优时,需要根据鲲鹏DevKit性能优化工具采集分析的实际结果和对应的优化建议进行调优操作。具体的调优思路可以参考本次实践。


