我有一个 Java 程序,用于跨多个处理器进行一组科学计算,方法是将其分成多个部分并在不同的线程中运行每个部分。该问题是可以简单划分的,因此线程之间不存在争用或通信。他们访问的唯一公共数据是一些不需要同步访问的共享静态缓存,以及硬盘驱动器上的一些数据文件。线程也不断地写入磁盘,但写入的是单独的文件。
我的问题是,有时当我运行程序时,速度非常快,有时当我运行完全相同的东西时,它运行速度非常慢。如果我看到它运行缓慢,然后按 ctrl-C 并重新启动它,它通常会再次开始快速运行。它似乎在运行初期就将自己设置为慢速模式或快速模式,并且从不在模式之间切换。
我已将其连接到 jconsole,这似乎不是内存问题。当我发现它运行缓慢时,我尝试将探查器连接到它,但探查器无法连接。我尝试过使用 -Xprof 运行,但慢速运行和快速运行之间的转储似乎没有太大不同。我也尝试过使用不同的垃圾收集器和内存空间各个部分的不同大小。
我的机器是带有条带 RAID 分区的 mac pro。无论运行速度慢还是快,CPU 使用率都不会下降,如果线程花费太多时间阻塞磁盘读取,您会预料到这一点,所以我认为这可能不是磁盘读取问题。
我的问题是,我的代码的哪些类型的问题可能会导致此问题?或者这可能是操作系统问题?我无法在 Windows 计算机上复制它,但我没有具有类似 RAID 设置的 Windows 计算机。
您的线程可能已进入无限循环。
尝试连接 VisualVM 并使用线程监视器。
https://visualvm.dev.java.net
您可能必须在问题发生之前进行连接。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)