Docker:启用内存限制并禁用内存过量使用容器的负面影响是什么?

时间:2017-01-16 09:37:02

标签: java linux memory docker

在我的环境中,我将禁用内存过量使用(vm.overcommit = 2)。这也会禁用Linux OOMKiller。

原因是我在Docker容器中运行Java应用程序并且内存大小有限,我希望看到它们失败并使用OOMError(并编写堆转储),而不是只是被Linux OOMKiller静默杀死。

我不确定这可能带来的负面影响。我不是Linux内核,docker内存管理或Java VM专家,所以决定在这里问。

如果有人有这样的经历,你能告诉我吗?

1 个答案:

答案 0 :(得分:1)

如果禁用内存过量使用,那么如果JVM从操作系统请求内存并且所有内存都已提交,则系统调用将失败。当发生这种情况时,JVM会因OOME失败而消息包含"超出交换空间?"。

我对the Oracle OOME troubleshooting documentation的解读是,这将导致写入致命的错误日志文件。目前尚不清楚是否可以创建堆转储。

如果您正在尝试追踪可疑的内存泄漏,我建议将初始堆和最大堆大小设置为相同的值,并使它们足够小以至于您没有得到"没有交换空间?" OOME。如果你得到一个正常的" OOME,你应该能够获得堆转储。