---
title: 调优过程
description: "- 已安装鲲鹏DevKit。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengdevps/profiler/demo/kunpengbestdeadlock_21_0005.html
sourcePath: /source/zh/kunpengdevps/profiler/demo/kunpengbestdeadlock_21_0005.html
indexId: 07117ab77a783e239ef7851e9eea2d8e0d8e5900468d30d103e8dfd6810adcc970
---
# 调优过程

#### 前提条件

- 已安装鲲鹏DevKit。
- 服务器和操作系统正常运行。
- PC端已经安装SSH远程登录工具。
- 准备需要优化的Java程序并在目标服务器上启动。


#### 操作步骤

实践使用demo(https://github.com/kunpengcompute/devkitdemo/tree/main/Hyper_tuner/testdemo/基于java性能分析工具的死锁调优实践)可自行下载。

1. 对程序进行在线分析，在概览页签下观察每种状态的线程数。
  发现有两个线程处于阻塞状态，有死锁的嫌疑。

  图1 概览

2. 切换到CPU页签下的线程列表，搜索阻塞状态的线程。
  观察一段时间后发现两个线程一直处于阻塞状态，执行多次线程转储操作。

  图2 线程列表

3. 选择CPU页签中线程转储下的锁分析图。
  发现两个阻塞中的线程发生了死锁。

  图3 锁分析图

4. 选择CPU页签中线程转储下的原始数据。
  根据线程转储的原始数据得到死锁的相关信息。

  图4 线程转储

5. 查看死锁问题优化建议。
  图5 优化建议

6. 根据优化建议定位死锁原因。
  根据线程转储提供的相关信息，搜索代码中的相关项，发现程序发生了死锁，原因是两个线程持有锁的顺序不当导致，可由DeadLock.java(https://github.com/kunpengcompute/devkitdemo/blob/main/Hyper_tuner/testdemo/基于java性能分析工具的死锁调优实践/DeadLock.java)优化为UnDeadLock.java(https://github.com/kunpengcompute/devkitdemo/blob/main/Hyper_tuner/testdemo/基于java性能分析工具的死锁调优实践/UnDeadLock.java)。

7. 查看优化后程序。
  调整两个线程持有锁的顺序后，程序不再发生死锁。

  图6 概览

  图7 线程列表


#### 总结

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

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