我有一个Java程序,用于将多个处理器分成多个部分并在不同的线程中运行,从而在多个处理器上进行一组科学计算。这个问题是微不足道的,因此线程之间没有争用或通信。他们访问的唯一通用数据是一些不需要同步访问权限的共享静态缓存,以及硬盘上的一些数据文件。线程也不断地写入磁盘,但要分开文件。
我的问题是,有时我运行程序时速度很快,有时当我运行完全相同的程序时运行速度非常慢。如果我看到它运行缓慢并按ctrl- C并重新启动它,通常它将再次开始快速运行。它似乎在运行初期就将自己设置为慢速模式或快速模式,并且从未在模式之间切换。
我已经将它连接到jconsole,这似乎不是内存问题。当我发现它运行缓慢时,我尝试将它连接到探查器,但探查器无法连接。我曾尝试使用- Xprof运行,但慢速运行和快速运行之间的转储似乎并没有太大不同。我也尝试过使用不同的垃圾收集器以及内存空间各个部分的不同大小。
我的机器是具有条纹RAID分区的mac pro。无论是缓慢运行还是快速运行,cpu的使用率永远不会降低,如果线程花费太多时间阻止从磁盘读取数据,您会期望它的使用,因此我认为这可能不是磁盘读取问题。
我的问题是,我的代码有哪些类型的问题可能会导致这种情况?还是这可能是操作系统问题?我无法在Windows机器上复制它,但是我没有具有类似RAID设置的Windows机器。
您可能拥有陷入无尽循环的线程。
尝试连接VisualVM并使用线程监视器。
https://visualvm.dev.java.net
问题发生之前,您可能必须连接。