鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

调优过程

前提条件

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

操作步骤

实践使用demo可自行下载。

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

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

    图1 概览
  2. 切换到CPU页签下的线程列表,搜索阻塞状态的线程。

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

    图2 线程列表
  3. 选择到CPU页签中线程转储下的锁分析图。

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

    图3 锁分析图
  4. 选择CPU页签中线程转储下的原始数据。

    根据线程转储的原始数据得到死锁的相关信息。

    图4 线程转储
  5. 查看死锁问题优化建议。
    图5 优化建议
  6. 根据优化建议定位死锁原因。

    根据线程转储提供的相关信息,搜索代码中的相关项,发现程序发生了死锁,原因是两个线程持有锁的顺序不当导致,可由DeadLock.java优化为UnDeadLock.java

  7. 查看优化后程序。

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

    图6 概览
    图7 线程列表

总结

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

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