鲲鹏社区首页
中文
注册
开发者
基于DevKit Java性能分析工具的调优实践——死锁问题

基于DevKit Java性能分析工具的调优实践——死锁问题

DevKitjavajdk性能调优

发表于 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 前提条件

  1. 服务器和操作系统正常运行。
  2. PC端已经安装SSH远程登录工具
  3. 需要优化的Java程序

4 调优思路

  1. 使用Java性能优化工具对Java进程进行在线分析;
  2. 使用Java性能优化工具对Java进程进行采样分析
  3. 针对性能的瓶颈点进行性能优化;
  4. 观察优化后的Java程序,判断问题是否解决

5 调优过程

5.1 对程序进行在线分析,在概览页签下观察每种状态的线程数

发现一直有两个线程处于阻塞状态,有死锁的嫌疑

image.png

5.2 切换到线程页签,搜索阻塞状态的线程

观察一段时间发现发两个线程一直处于阻塞状态,执行多次线程转储操作。

image.png

5.3 切换到锁分析图页签

发现两个阻塞中的线程发生了死锁

image.png

5.4  切换到线程转储页签

根据线程转储信息得到死锁的相关信息

image.png

5.5  发现问题并解决

根据线程转储提供的相关信息,搜索代码中的相关项,本案例的 demo 比较简单,

可以看到程序的确发生了死锁,根据实际情况进行修改。

demo 是因为两个线程持有锁的顺序不当导致

image.png

修改后的代码:

image.png

5.6 程序优化后

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

image.png

image.png

6 实践总结

Java中的死锁问题一旦发生很难定位具体的代码位置,因为程序干扰因素比较多,所以涉及加锁解锁逻辑的地方一定要仔细。建议如果涉及加锁的代码逻辑,程序是通过新起线程去执行或者是在线程池中执行,一定要给线程设置有特定业务逻辑的名称,一旦发生问题也好定位。

在进行其他程序调优时,需要根据鲲鹏DevKit性能优化工具采集分析的实际结果和对应的优化建议进行调优操作。具体的调优思路可以参考本次实践。


本页内容