Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Mac OS cont';D_Java_Multithreading_Macos_Random_Operating System - Fatal编程技术网

Java Mac OS cont';D

Java Mac OS cont';D,java,multithreading,macos,random,operating-system,Java,Multithreading,Macos,Random,Operating System,几个星期前我问过这个问题,但我仍然有这个问题,我有一些新的提示。原来的问题是: 基本上,我有一个java应用程序,它将作业分割成独立的部分,并在单独的线程中运行它们。线程没有同步或共享内存项。它们共享的唯一资源是硬盘上的数据文件,每个线程都有一个开放的文件通道 大多数情况下,它运行得很快,但有时它会运行得很慢,没有明显的原因。如果我将CPU分析器连接到它,那么它将再次快速运行。如果我拍一张CPU快照,它会说它的大部分时间都花在“自时间”上,而这个函数除了检查一些(非共享的非同步的)布尔值之外什

几个星期前我问过这个问题,但我仍然有这个问题,我有一些新的提示。原来的问题是:

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

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

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


有人知道这会是什么样的问题吗?可能是操作系统(OSX10.6.2)吗?我无法在windows计算机上复制它,但我没有类似硬件配置的计算机

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

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

实际上这是一个有趣的问题,我很想知道问题出在哪里

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

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

  • 第三,您是否尝试将线程池缩小一点,您所说的是同时运行100个线程。例如,试着让他们20或40岁。看看有没有不同

  • 最后,我想看看您是如何实现多线程解决方案的。代码的一小部分就可以了


    • 实际上这是一个有趣的问题,我很想知道问题出在哪里

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

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

      • 第三,您是否尝试将线程池缩小一点,您所说的是同时运行100个线程。例如,试着让他们20或40岁。看看有没有不同

      • 最后,我想看看您是如何实现多线程解决方案的。代码的一小部分就可以了


        • 回复可能有点晚,但我可以在线程中使用Random观察到类似的减速,这与java.util.Random中使用的易失性变量有关-有关详细信息,请参阅。如果我得到的答案是正确的(对我来说这听起来很合理),那么减速可能与随机变量中使用的易失性变量的内存地址有关(看看用户对我的问题的“不可替换”的答案,这比我在这里做得更好)


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

          回复可能有点晚,但我可以在线程中使用Random观察到类似的减速,这与java.util.Random中使用的易失性变量有关-有关详细信息,请参阅。如果我得到的答案是正确的(对我来说这听起来很合理),那么减速可能与随机变量中使用的易失性变量的内存地址有关(看看用户对我的问题的“不可替换”的答案,这比我在这里做得更好)


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

          我有一个打印输出,偶尔告诉我每秒处理的消息。一般情况下,它在300000范围内,但当它运行缓慢时,它约为15000。当我把cpu档案器挂起来的时候