好吧,我有一个在 Windows 下编写的 java 程序,它运行良好。基本上它与算法相关,在它运行期间它通常会消耗几乎全部的 CPU 容量,这是正常的。
但是在 MacOS 下,它总是卡在某个特定点,即有大量数据并且内存消耗达到约 240M。该程序仍在运行,但不会继续。内存没有释放,但 CPU 使用率下降到 0。我不知道这到底是什么意思,也不知道发生了什么。
抱歉,我无法提供代码片段,因为这不是代码特定部分的问题。任何熟悉JVM的人都可以提供一些提示/建议吗?
我要做的第一件事是进行线程转储并找出谁在做什么。您可以发出 akill -3
来获取线程转储,或者您也可以连接分析器。详情请看这个答案:线程转储分析工具/方法
如果您无法弄清楚发生了什么,您可能想在此处发布线程转储。
我的疯狂猜测是并发错误,就像死锁一样,但我们必须看到线程转储!
如果发生这种情况时您的硬盘驱动器正忙,则意味着您的 JVM 使用的物理内存超出了可用的物理内存,它只是在交换交换文件。交换过程本身并不使用太多 CPU,但该过程涉及大量 I/O。因此CPU使用率很低。
尝试将您的堆大小限制为可用的物理 RAM(不要增加到总数,因为 4 GB 的机器在启动 JVM 时可能只有 1 GB 可用)。