删除锁定时的Java性能降级

时间:2009-04-22 20:22:34

标签: java performance

我正在测试我的java应用程序是否存在任何性能瓶颈。该应用程序使用concurrent.jar进行锁定。

我有一个高计算调用,它为其操作调用锁定和解锁函数。 在从代码中删除锁定解锁机制后,我已经看到了多次折叠导致性能下降,这与我的预期相反。其中观察到的是CPU消耗的增加,这使我觉得程序运行得更快但实际上并非如此。

Q1。当我们删除锁时,这会导致性能下降的原因是什么?

最诚挚的问候!!!

4 个答案:

答案 0 :(得分:3)

描述它。这里的任何其他内容都只是一个猜测而且是一个不知情的人。

使用像YourKit这样的探查器不仅可以告诉你哪些方法在CPU时间方面是“热点”,而且还会告诉你线程在大部分时间内花费的时间是阻塞还是等待

答案 1 :(得分:3)

这可能是一个非常常见的发现,取决于您正在做什么以及您使用什么作为锁定的替代方案。

基本上,发生的事情是像ReentrantLock这样的构造内置了一些逻辑,当它们实际上无法获得锁定时,它们知道“何时退出”。这减少了在反复尝试获取锁的逻辑中被烧毁的CPU数量,如果使用更简单的锁定结构,就会发生这种情况。

举个例子,看看我急忙提出的图here。它显示了线程的吞吐量不断访问数组的随机元素,使用不同的结构作为锁定机制。沿X轴是线程数; Y轴是吞吐量。蓝线是ReentrantLock;黄色,绿色和棕色线条使用自旋锁的变体。请注意,如果线程数量较少,则自旋锁的吞吐量会比您预期的要高,但随着线程数量的增加,ReentrantLock的退避逻辑会启动,并且最终会做得更好,而且争用率很高,自旋锁只是坐着燃烧CPU。

顺便说一句,这实际上是在双处理器机器上进行的试运行;我也在亚马逊云中运行它(实际上是一个8路Xeon),但我咳嗽......放错了文件,但我会找到它或者很快再次运行实验并训练和发布更新。但是你会得到一个与我记忆基本相似的模式。

更新:是否处于锁定代码中,某些多处理器架构可能发生的现象是,当多个处理器执行大量内存访问时,最终可能会溢出内存总线,实际上处理器相互减速。 (这有点像以太网 - 你添加到网络的机器越多,发送数据时发生冲突的可能性就越大。)

答案 2 :(得分:1)

它仍然正常运行吗?例如,在app服务器中有一个案例,其中一个非同步HashMap偶尔会导致无限循环。不难看出如何简单地重复工作。

答案 3 :(得分:0)

当您删除共享内存保护时,最可能出现性能下降和CPU使用率增加的罪魁祸首是竞争条件。两个或多个线程可以在共享对象上不断地来回翻转状态标志。

有关您的申请目的的更多描述将有助于诊断。