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 - 京东商城-基础平台部-JDOS团队

赞同来自: tony20071205


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

要回复问题请先登录注册