我有通过分解成片和运行在不同的线程每段做一组跨多个处理器科学计算的一个Java程序。问题是平凡的分区所以有在线程之间没有竞争或通信。他们访问的唯一的通用数据是不需要有自己的访问不同步的一些共享静态缓存和硬盘驱动器上的一些数据文件。螺纹也不断写入磁盘,但到单独的文件。

我的问题是,有时,当我运行程序我得到很好的速度,有时当我运行完全相同的运行速度非常慢。如果我看到它运行缓慢和Ctrl-C,然后重新启动它,它通常会开始再次快速运行。这似乎本身早就进入设置或者慢速模式或快速模式在运行和模式之间切换从来没有。

我迷上它到JConsole的和它似乎并不成为一个内存问题。当我抓住它运行缓慢,我试图连接探查器,但该分析器将无法连接。我试着-Xprof运行,但似乎慢运行和快速运行之间的转储不会有很大的区别。我已经使用不同的垃圾收集器和存储器空间的各个部分的不同的胶料,也尝试。

我的机器是条纹RAID分区的Mac Pro。 CPU使用率从来没有脱落其是否缓慢或快速运行,而如果线程中花费太多时间阻止从磁盘读取你所期望的,所以我不认为这可能是一个磁盘读取问题。

我的问题是,什么类型的我的代码问题可能导致此?或者,可这是一个操作系统的问题?我一直无法复制它在Windows机器,但我没有Windows机器具有类似RAID的设置。

有帮助吗?

解决方案

您可能有线程已经进入一个死循环。

尝试用VisualVM的连接和使用线程监视器。

https://visualvm.dev.java.net

您可能必须连接出现问题之前。

scroll top