2017-01-16 24 views
0

在我的环境中,我将禁用内存过量使用(vm.overcommit = 2)。这也禁用了Linux OOMKiller。Docker:运行容器的内存限制已启用且内存过载禁用的负面影响是什么?

原因是我在Docker容器中运行Java应用程序时,内存大小受到了限制,我希望看到它们与OOMError(并写入堆转储)失败,而不是仅仅由Linux OOMKiller静静地杀死。

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

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

回答

1

如果禁用内存过量使用,那么如果JVM向操作系统请求内存并且所有内存都已提交,则系统调用将失败。发生这种情况时,JVM将失败,并显示OOME和包含“Out of swap space?”的消息。

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


如果你试图追查可疑的内存泄漏,我建议设置初始堆和最大堆大小是相同的价值,并让他们足够小,你没有得到“外出的交换空间?“ OOME。如果你得到一个“正常”的OOME,你应该能够得到一个堆转储。

+0

谢谢,斯蒂芬。我计划将-Xmx设置为-Xmx,并使用-XX:+ HeapDumpOnOutOfMemoryError JVM选项使Java应用程序自动生成堆转储。但是我不确定在禁用内存过量使用时,Java应用程序是否会因OOM而失败。如果它以不同的错误类型失败,它将不会自动生成堆转储,这对我来说是不受欢迎的行为。 – daniilyar

+0

我建议你尝试一些简单的实验。 –

相关问题