在我的环境中,我将禁用内存过量使用(vm.overcommit = 2)。这也会禁用Linux OOMKiller。
原因是我在Docker容器中运行Java应用程序并且内存大小有限,我希望看到它们失败并使用OOMError(并编写堆转储),而不是只是被Linux OOMKiller静默杀死。
我不确定这可能带来的负面影响。我不是Linux内核,docker内存管理或Java VM专家,所以决定在这里问。
如果有人有这样的经历,你能告诉我吗?
答案 0 :(得分:1)
如果禁用内存过量使用,那么如果JVM从操作系统请求内存并且所有内存都已提交,则系统调用将失败。当发生这种情况时,JVM会因OOME失败而消息包含"超出交换空间?"。
我对the Oracle OOME troubleshooting documentation的解读是,这将导致写入致命的错误日志文件。目前尚不清楚是否可以创建堆转储。
如果您正在尝试追踪可疑的内存泄漏,我建议将初始堆和最大堆大小设置为相同的值,并使它们足够小以至于您没有得到"没有交换空间?" OOME。如果你得到一个正常的" OOME,你应该能够获得堆转储。