请教 JVM 堆大小分配问题

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

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

注:
1.Docker 物理机的 内存为8G,Swap 为 0。
2.上面的 java 应用在 Docker 运行一段时间后,就会发生 oom ,被系统 kill 掉了。
2130 次点击
所在节点    程序员
7 条回复
anexplore
2016-11-24 18:53:51 +08:00
adaptivesizepolicy?
misaka19000
2016-11-24 19:01:41 +08:00
操作系统虚拟内存?
Infernalzero
2016-11-24 19:11:37 +08:00
是可以设置超过系统物理内存的,除非你是 32 位的那最多 4G ,剩下就是等 OOM killer 把你的程序干掉
imkh
2016-11-24 19:37:47 +08:00
@Infernalzero 机器操作系统是 64 位的 Centos 7
billlee
2016-11-24 21:16:36 +08:00
在内核看来,内存是在发生缺页中断的时候才分配的。
beyondsoft
2016-11-24 21:30:40 +08:00
docker 启动的参数是怎么样的 ?

默认有开启 swap 的 可以用
--memory-swappiness=0 关闭
同时可以用 docker stats 看下效果
hyperdak288
2016-11-24 22:45:40 +08:00
楼主加上 -XX:+AlwaysPreTouch 试试?
jvm 的 xmx 和 xms 参数并不会真的申请那么多内存,儿 AlwaysPreTouch 可以保证 commit 所有声明的内存

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/323004

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX