通过 Java 线程堆栈进行性能瓶颈分析

本文探讨了如何通过Java线程堆栈分析性能瓶颈,包括锁粒度过大、资源争用等问题。文章指出,性能瓶颈的识别至关重要,通过线程堆栈可以定位到问题所在,如大部分线程在相同上下文、等待状态或线程数量不足等。此外,文中还提出了优化策略,如减少锁的粒度,以提高系统性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

改善性能意味着用更少的资源做更多的事情。为了利用并发来提高系统性能,我们需要更有效的利用现有的处理器资源,这意味着我们期望使CPU尽可能出于忙碌状态(当然,并不是让CPU周期出来应付无用计算,而是让CPU做有用的事情而忙)。如果程序受限于当前的CPU计算能力,那么我们通过增加更多的处理器或者通过集群就能提高总的性能总的来说,性能提高,需要且仅需要解决当前的受限资源,当前受限资源可能是:

  • CPU:如果当前CPU已经能够接近100%的利用率,并且代码业务逻辑无法再简化,那么说明该系统的性能以及达到上线,只有通过增加处理器来提高性能
  • 其他资源:比如连接数等。可以修改代码,尽量利用CPU,可以获得极大的性能提升

如果你的系统有如下的特点,说明系统存在性能瓶颈:

  • 随着系统逐步增加压力,CPU使用率无法趋近100%(如下图)

  • 持续运行缓慢。时常发现应用程序运行缓慢。通过改变环境因子(负载,连接数等)也无法有效提升整体响应时间

  • 系统性能随时间的增加逐渐下降。在负载稳定的情况下,系统运行时间越长速度越慢。可能是由于超出某个阈值范围,系统运行频繁出错从而导致系统死锁或崩溃
  • 系统性能随负载的增加而逐渐下降。

一个好的程序,应该是能够充分利用CPU的。如果一个程序在单CPU的机器上无论多大压力都不能使CPU使用率接近100%,说明这个程序设计有问题。一个系统的性能瓶颈分析过程大致如下:

  1. 先进性单流程的性能瓶颈分析,受限让单流程的性能达到最优。
  2. 进行整体性能瓶颈分析。因为单流程性能最优,不一定整个系统性能最优。在多线程场合下,锁争用㩐给也会导致性能下降。

高性能在不同的应用场合下,有不同的含义:

  1. 有的场合高性能意味着用户速度的体验,如界面操作等
  2. 有的场合,高吞吐量意味着高性能,如短信或者彩信,系统更看重吞吐量,而对每一个消息的处理时间不敏感
  3. 有的场合,是二者的结合

性能调优的终极目标是:系统的CPU利用率接近100%,如果CPU没有被充分利用,那么有如下几个可能:

  1. 施加的压力不足
  2. 系统存在瓶颈

1常见的性能瓶颈

1.1由于不恰当的同步导致的资源争用

1.1.1不相关的两个函数,公用了一个锁,或者不同的共享变量共用了同一个锁,无谓地制造出了资源争用

下面是一种常见的错误

class 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

训练营资料福利官

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值