Mac OS上的Java随机减速续表

时间:2009-11-15 20:12:03

标签: java multithreading macos random operating-system

几周前我问了这个问题,但我仍然遇到了问题,我有一些新的提示。最初的问题在这里:

Java Random Slowdowns on Mac OS

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

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

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

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

3 个答案:

答案 0 :(得分:1)

回复可能有点迟,但是我可以观察到使用随机线程中的类似减速,与java.util.Random中使用的volatile变量相关 - 有关详细信息,请参阅How can assigning a variable result in a serious performance drop while the execution order is (nearly) untouched?。如果我得到的答案是正确的(这对我来说听起来很合理),减速可能与Random中使用的volatile变量的内存地址有关(看看用户对我的'不可信'的答案)问题,这比我在这里解释问题要好得多。)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

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

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

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