调优过程
前提条件
- 服务器和操作系统正常运行。
- PC端已经安装SSH远程登录工具。
- 需要优化的Java程序。
操作步骤
- 对程序进行在线分析,在概览页签下观察每种状态的线程数。
发现有两个线程处于阻塞状态,有死锁的嫌疑。
图1 概览 - 切换到CPU页签下的线程列表,搜索阻塞状态的线程。
观察一段时间发现发两个线程一直处于阻塞状态,执行多次线程转储操作。
图2 线程列表 - 选择到CPU页签中线程转储下的锁分析图。
发现两个阻塞中的线程发生了死锁。
图3 锁分析图 - 选择CPU页签中线程转储下的原始数据。
根据线程转储的原始数据得到死锁的相关信息。
图4 线程转储 - 查看死锁问题优化建议。图5 优化建议
- 根据优化建议定位死锁原因。
根据线程转储提供的相关信息,搜索代码中的相关项,发现程序发生了死锁,原因是两个线程持有锁的顺序不当导致,可由DeadLock.java优化为UnDeadLock.java。
- 查看优化后程序。
调整两个线程持有锁的顺序后,程序不再发生死锁。
图6 概览图7 线程列表
总结
Java中的死锁问题一旦发生很难定位具体的代码位置,因为程序干扰因素比较多,所以涉及加锁解锁代码逻辑地方一定要仔细。建议如果涉及加锁的代码逻辑,程序是通过新起线程去执行或者是在线程池中执行,一定给线程设置有特定业务逻辑的名称,一旦发生问题也好定位。
在进行其他程序调优时,需要根据鲲鹏DevKit Java性能分析工具采集的实际结果和对应的优化建议进行调优操作。具体的调优思路可以参考本次实践。
父主题: 实践7:死锁调优实践