Mac OS上的Java随机减速续表

几个星期前我问了这个问题,但我仍然遇到了问题,我有一些新的提示。 原来的问题在这里:

Mac OS上的Java随机减速

基本上,我有一个java应用程序,它将作业拆分为独立的部分,并在不同的线程中运行它们。 线程没有同步或共享内存项。 它们共享的唯一资源是硬盘上的数据文件,每个线程都有一个打开的文件通道。

大部分时间它运行速度非常快,但偶尔会出现非常慢的情况。 如果我将CPU分析器连接到它,它将再次开始快速运行。 如果我拍摄CPU快照,它会说它在“自我时间”中花费大部分时间在一个除了检查一些(非共享的非同步)布尔值之外什么都不做的函数中。 我不知道这是多么准确,因为1,它没有任何意义,2,附加探查器似乎将线程从他们所处的任何模式中解决并修复问题。 此外,无论它是快速运行还是慢速运行,它总是完成并提供相同的输出,并且它永远不会降低总CPU使用率(在这种情况下为~1500%),这意味着线程不会被阻塞。

我尝试过不同的垃圾收集器,不同的内存空间部分,将数据输出写入非raid驱动器,并将所有数据输出放在线程中,将主工作线程分开。

有谁知道这可能是什么样的问题? 它可能是操作系统(OS X 10.6.2)吗? 我无法在Windows机器上复制它,但我没有类似的硬件配置。

回复可能有点迟,但我可以观察到使用随机线程中的类似减速,与java.util.Random中使用的volatile变量相关 – 请参阅如何在执行顺序为执行顺序时分配变量结果严重的性能下降(几乎没有动过? 详情。 如果我得到的答案是正确的(这对我来说听起来很合理),那么减速可能与Random中使用的volatile变量的内存地址有关(看看用户对我的’不可信’的答案)问题,这比我在这里解释问题要好得多。

如果您在Threads的run-method中创建Random-instances,您可以简单地尝试将它们转换为对象变量并在Thread的构造函数中初始化它们:这很可能会确保volatile的volatile字段您的随机实例将最终位于RAM中的“不同区域”,而不必在处理器核心之间进行同步。

你怎么知道它运行缓慢? 当CPU分析器处于活动状态时,您如何知道它运行得更快? 如果你在探查器下完成整个运行它是否运行缓慢? 如果将线程数限制为1,它是否运行缓慢?

实际上这是一个有趣的问题,我很想知道这个问题是什么。

  • 首先,在上一个问题中,您说您在“多个”处理器之间拆分作业。 他们身体是多重的,就像多台机器一样? 还是多核CPU?

  • 其次,我不确定Snow Leopard是否与它有关,但我们知道SL在多处理器机器方面引入了一些新function。 因此,新操作系统上的VM可能存在一些问题。 尝试使用另一个Java版本,我知道SL默认使用Java 6。 尝试使用Java 5。

  • 第三,你是否试图让线程池变得更小,你说的是同时运行100个线程。 例如,尝试将它们设为20或40。 看看它是否有所作为。

  • 最后,我有兴趣了解您如何实现multithreading解决方案。 代码的一小部分将是好的