您的操作系统是否启用了交换。
我注意到 Java 会出现巨大的问题,一旦它填满了启用交换的操作系统上的所有内存——它实际上会破坏 Windows 系统,有效地将它们锁定并导致重新启动。
我的理论是这样的:
- 操作系统内存快满了。
- 操作系统从 Java 请求内存。
- 这会触发 Java 进入完整的 GC 以尝试释放内存。
- 完整的 GC 几乎会触及虚拟机内存的每一块,甚至是已换出的项目。
- 系统尝试将数据交换回 VM 的内存(在已经用完 ram 的系统上)
- 这一直在滚雪球。
起初它不会对系统产生太大影响,但是如果您尝试启动需要大量内存的应用程序可能需要很长时间,并且您的系统只会不断降级。
多个大型 VM 会使情况变得更糟,我运行 3 或 4 个大型 VM,当我的 RAM 使用率超过 60-70% 时,我的系统现在开始占用。
这是猜想,但它描述了我经过几天的测试后看到的行为。
效果是所有交换似乎都“阻止”了 gc。更准确地说,操作系统花费了大部分 GC 时间进行交换,这使得它看起来像是在 GC 期间无所事事。
修复--将 -Xmx 设置为较低的值,将其删除,直到您有足够的空间来避免交换。这一直解决了我的问题,如果它不能解决你的问题,那么我对你的问题的原因是错误的:)