V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
imkh
V2EX  ›  程序员

请教 JVM 堆大小分配问题

  •  
  •   imkh · 2016-11-24 16:20:38 +08:00 · 2241 次点击
    这是一个创建于 2931 天前的主题,其中的信息可能已经有所发展或是发生改变。
    背景:
    我用 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 掉了。
    7 条回复    2016-11-24 22:45:40 +08:00
    anexplore
        1
    anexplore  
       2016-11-24 18:53:51 +08:00   ❤️ 1
    adaptivesizepolicy?
    misaka19000
        2
    misaka19000  
       2016-11-24 19:01:41 +08:00   ❤️ 1
    操作系统虚拟内存?
    Infernalzero
        3
    Infernalzero  
       2016-11-24 19:11:37 +08:00   ❤️ 1
    是可以设置超过系统物理内存的,除非你是 32 位的那最多 4G ,剩下就是等 OOM killer 把你的程序干掉
    imkh
        4
    imkh  
    OP
       2016-11-24 19:37:47 +08:00
    @Infernalzero 机器操作系统是 64 位的 Centos 7
    billlee
        5
    billlee  
       2016-11-24 21:16:36 +08:00   ❤️ 1
    在内核看来,内存是在发生缺页中断的时候才分配的。
    beyondsoft
        6
    beyondsoft  
       2016-11-24 21:30:40 +08:00   ❤️ 1
    docker 启动的参数是怎么样的 ?

    默认有开启 swap 的 可以用
    --memory-swappiness=0 关闭
    同时可以用 docker stats 看下效果
    hyperdak288
        7
    hyperdak288  
       2016-11-24 22:45:40 +08:00   ❤️ 1
    楼主加上 -XX:+AlwaysPreTouch 试试?
    jvm 的 xmx 和 xms 参数并不会真的申请那么多内存,儿 AlwaysPreTouch 可以保证 commit 所有声明的内存
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1091 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 22:30 · PVG 06:30 · LAX 14:30 · JFK 17:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.