我有一个Java程序,用于在多个处理器之间进行一系列科学计算,方法是将其拆分为不同的线程并在其中运行各个部分。这个问题很简单,因此线程之间不存在争用或通信。他们访问的唯一常见数据是一些共享静态缓存,不需要同步访问权限,也可以访问硬盘上的一些数据文件。线程也连续写入磁盘,但分开文件。Java在Mac OS上的随机速度减慢
我的问题是,有时当我运行该程序时,我获得了非常好的速度,有时当我运行完全相同的东西时,它运行得非常缓慢。如果我看到它运行缓慢并按Ctrl-C并重新启动它,它通常会再次开始快速运行。它似乎在运行的早期阶段将其自身设置为低速模式或快速模式,并且从不在模式之间切换。
我已经把它连接到jconsole,它似乎不是一个内存问题。当我发现它运行缓慢时,我尝试连接一个探查器,但探查器无法连接。我试着用-Xprof运行,但慢速运行和快速运行之间的转储似乎没有太大的差别。我也尝试过使用不同的垃圾收集器和内存空间各个部分的不同尺寸。
我的机器是具有条带化RAID分区的mac pro。 CPU的使用率永远不会下降,无论它运行缓慢还是很快,如果线程花费太多时间阻塞从磁盘读取数据,您会期望这种情况,所以我不认为这可能是磁盘读取问题。
我的问题是,我的代码有哪些类型的问题可能导致这种情况?或者这可能是一个操作系统问题?我一直无法在一台机器上复制它,但我没有一台类似RAID设置的Windows机器。
尝试使用“java -server”运行,也许它随机选择不使用JIT?你怎么能确保不同的线程运行在不同的处理器/内核上? – 2009-10-30 20:33:31
@Piligrim,如果他使用默认配备64位Java 6的Mac OS X Snow Leopard,他已经在使用服务器版本。如果JVM会随机选择不使用JIT,这将是非常奇怪的 - 这不是一个现实的场景...... – Jesper 2009-10-30 22:15:46
是的,我一直在使用-d64,显然是代替服务器。 – javajustice 2009-10-30 22:18:12