线上机器CPU占用高分析实践

💡 原文中文,约2400字,阅读约需6分钟。
📝

内容提要

本文分析了线程的两种状态:WAITING和TIMED_WAITING。WAITING状态表示线程在等待特定操作,而TIMED_WAITING状态则是在指定时间内等待条件。通过代码分析,发现并发任务存在性能问题,建议优化线程池逻辑和异常处理,以减少CPU资源浪费。

🎯

关键要点

  • 本文分析了线程的两种状态:WAITING和TIMED_WAITING。

  • WAITING状态表示线程在等待特定操作,不会继续执行。

  • TIMED_WAITING状态表示线程在指定时间内等待条件,超时后自动返回。

  • 线程进入WAITING状态的常见情况包括调用Object.wait()、Thread.join()和LockSupport.park()。

  • 线程进入TIMED_WAITING状态的常见情况包括调用Thread.sleep()、Object.wait()和Thread.join()。

  • 在实际代码中,发现并发任务存在性能问题,建议优化线程池逻辑和异常处理。

  • 火焰图分析显示多次的stream调用导致CPU资源浪费,建议将toMap逻辑提到循环外。

  • 优化建议包括取消超时线程的执行,减少CPU资源浪费。

  • 观察到queryActTp处于WAITING状态可能是由于执行未取消,需进一步分析原因。

🔎

延伸解读

线程状态的影响

线程的WAITING和TIMED_WAITING状态直接影响系统性能。WAITING状态下,线程无法执行,可能导致资源浪费。开发者应关注这些状态的出现频率,优化代码逻辑,避免不必要的等待,提升系统响应速度。

优化建议的实用性

文章中提到的优化建议,如将toMap逻辑提到循环外和取消超时线程的执行,能够有效减少CPU资源的浪费。这些措施在高并发场景下尤为重要,开发者应根据实际情况灵活应用,以提升系统的整体性能。

火焰图分析的重要性

火焰图分析提供了对CPU使用情况的直观了解,帮助识别性能瓶颈。通过分析火焰图,开发者可以发现多次stream调用导致的资源浪费,从而进行针对性优化,提升代码执行效率。

延伸问答

什么是WAITING状态?

WAITING状态表示线程在等待另一个线程的特定操作,不会继续执行,直到被通知或中断。

TIMED_WAITING状态与WAITING状态有什么区别?

TIMED_WAITING状态是线程在等待某个条件的发生,但会在指定时间后自动返回,而WAITING状态则不会自动返回。

如何优化线程池逻辑以减少CPU资源浪费?

建议取消超时线程的执行,并将多次的stream调用优化,将toMap逻辑提到循环外。

线程进入WAITING状态的常见情况有哪些?

常见情况包括调用Object.wait()、Thread.join()和LockSupport.park()。

在实际代码中发现了哪些性能问题?

发现并发任务存在性能问题,尤其是CPU频繁切换导致的压力。

如何恢复TIMED_WAITING状态的线程?

TIMED_WAITING状态的线程会在指定时间结束后自动恢复,或在其他线程调用notify()或notifyAll()时恢复。

🏷️

标签

➡️

继续阅读