Docker容器内存分配问题


背景:
我用 Docker 来跑一个 java 应用,在 Docker 层限制了容器的内存大小为 1G 。
然后使用命令 java -Xms3G -Xmx3G javaapp 在容器里面启动应用,应用也可以正常启动。

问题来了,-Xms ,-Xmx 都为 3G ,但我分配给这个 Docker 容器的内存并没有 3G ,只有 1G 。
问题 1 :
为什么 java 应用还可以启动? 难道Docker的内存限制并没有生效?
问题 2 :
这时候-Xms 的值和-Xmx 的值是如何分配的?

注:
1.Docker 物理机的 Swap 为 0 ,内存为8G。
2.上面的 java 应用在 Docker 运行一段时间后,就会发生 oom ,被系统 kill 掉了。
已邀请:

xiaolunsanguo - 京东商城-TIG-JDOS团队

赞同来自: tony20071205


你这个问题问的很好。我来试着解答一下。
docker的CPU限制是1G,并不是说docker给这个容器上来就实际分配了1G,而是通过cgroup设置最大内存使用量为1G。
java你虽然配置了-Xms ,-Xmx 都为 3G,但是这个java进程一上来就是3G,而是不断增长的过程(具体是怎么增长的,我不了解,这个可以查询一下jvm的一些资料)。这个过程你也可以通过监控java使用的内存量进行观察。所以java应用还可以启动。
但是一旦java进程的内存(准确的说应该是容器内所有进程的内存总量)超过了1G,就会发生OOM,这也说明了docker的内存限制生效了。

吴锦晟 - 网映科技 CTO

赞同来自:


的确是这样,这里需要注意-Xms ,-Xmx 值一致在prod环境下是建议这么做的,可以避免不必要的抖动。第二,Xmx只是设置了Heap的值并不是RAM的最大值,可以通过 -XX:MaxDirectMemorySize 去设置RAM的最大值。还有Docker -m 的设置 描述基本和@xiaolunsanguo描述一致。

吴锦晟 - 网映科技 CTO

赞同来自:


最近我发现一个奇怪的现象,用docker container的内存消耗非常的高,不知道什么情况,在将prod环境升级至Spring Cloud Dalston.SR4之后,Container的内存消耗翻倍了。跟了下也没发现什么问题。

要回复问题请先登录注册