Mac OS上的Java随机减速

我有一个Java程序,用于在多个处理器之间进行一系列科学计算,将其分解为多个部分并在不同的线程中运行每个部分。 这个问题很容易分区,因此线程之间没有争用或通信。 他们访问的唯一常见数据是一些不需要同步访问的共享静态缓存,以及硬盘上的一些数据文件。 线程也在不断写入磁盘,但要分离文件。

我的问题是,有时当我运行程序时,我获得了非常好的速度,有时当我运行完全相同的东西时,它运行得非常慢。 如果我看到它运行缓慢并且ctrl-C并重新启动它,它通常会再次开始快速运行。 它似乎在运行的早期设置为慢速模式或快速模式,并且从不在模式之间切换。

我把它连接到jconsole,它似乎不是一个内存问题。 当我抓住它慢慢地运行时,我已经尝试将探查器连接到它,但探查器将无法连接。 我尝试使用-Xprof运行但是慢速运行和快速运行之间的转储似乎没有太大的不同。 我也试过使用不同的垃圾收集器和内存空间的各个部分的不同的sizings。

我的机器是带有条带RAID分区的mac pro。 无论是缓慢运行还是快速运行,cpu的使用率都不会下降,如果线程在磁盘读取时花费太多时间阻塞,那么你会期望它,所以我不认为这可能是磁盘读取问题。

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

您可能拥有进入无限循环的线程。

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

https://visualvm.dev.java.net

您可能必须在问题发生之前进行连接。

我认为你应该用一个查看线程视图的探查器来做这件事 – 有多少线程,它们处于什么状态等等。这可能是一个奇怪的竞争条件时有发生。 也可能是使用分析器钩子(导致减速)对类进行检测的情况,将竞争条件排序,并且您将看到附加的分析器没有减速:/

请看一下这篇文章 ,或者更确切地说是答案,其中提到了Cache争用问题。

你每次都会产生相同数量的线程吗? 该数字是否小于或等于平台上可用的线程数? 可以相当精确地检查或估计该数字。

请发布任何finidngs!

你有测量CPU温度的工具吗? 操作系统可能会限制CPU来处理温度问题。

您的程序有时可能被分页到磁盘吗? 在这种情况下,您需要查看整个操作系统的内存使用情况,而不仅仅是您的程序。 我从经验中知道,当内存不断被分页到磁盘并返回时,运行时性能会有很大差异。

我对OSX知之甚少,但在linux中,“free”命令对此有用。

可能导致这种减速的另一个问题是日志文件? 我至少知道一些日志代码随着日志文件的增长而逐步减慢系统速度。 您的线程可能正在大小增加的日志文件上进行同步,然后当您重新启动程序时,会使用另一个日志文件。