首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >除了互斥锁或垃圾收集之外,还有什么机制可以降低我的多线程java程序的运行速度?

除了互斥锁或垃圾收集之外,还有什么机制可以降低我的多线程java程序的运行速度?
EN

Stack Overflow用户
提问于 2012-12-20 17:36:11
回答 3查看 688关注 0票数 17

Problem

我有一段java代码(如果相关的话是JDK 1.6.0._22 ),它实现了一个没有互斥锁的无状态、无副作用的函数。然而,它确实使用了大量内存(我不知道这是否相关)。

在过去,我访问过Sun实验室,收集了标准的“性能与线程数”曲线。由于此函数没有互斥锁,因此它有一个很好的图形,尽管垃圾收集是随着线程数量的增加而启动的。经过一些垃圾收集调优之后,我能够使这条曲线变得几乎平坦。

我现在正在英特尔硬件上做同样的实验。硬件有4个CPU,每个CPU有8个内核和超线程。这样就得到了64个availableProcessors()。不幸的是,“性能与线程数”的曲线对于1、2、3个线程都有很好的伸缩性,并且在3个线程上有上限。在3个线程之后,我可以将任意多个线程放到任务中,但性能并没有得到改善

尝试修复问题

我的第一个想法是我太愚蠢了,在某个地方引入了一些同步的代码。通常,要解决此问题,我会运行JConsole或JVisualVM,并查看线程堆栈跟踪。如果我有64个线程以3的速度运行,我预计其中61个线程正在等待进入互斥。我没找到这个。相反,我发现所有的线程都在运行:只是速度非常慢。

另一种想法是,也许时间框架引入了问题。我把我的函数换成了一个使用AtomicLong就能数到十亿的伪函数。这与线程的数量很好地结合在一起: 64个线程比1个线程快了64倍,我可以数到10,000倍。

我想(绝望地开始)也许垃圾收集需要很长的时间,所以我调整了垃圾收集参数。虽然这改善了我的延迟变化,但对吞吐量没有影响:我仍然有64个线程在以我期望的3个线程的速度运行。

我已经下载了英特尔工具VTunes,但我的技能很弱:它是一个复杂的工具,我还不了解它。我已经订购了一本说明书:给自己一份有趣的圣诞礼物,但这对我目前的问题有点为时已晚。

问题

  1. 我可以使用哪些工具(智力或软件)来提高我对正在发生的事情的理解?
  2. 除了互斥锁或垃圾收集之外,还有什么机制可能会降低我的代码速度?
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13969076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档