|
本文内容来自redhat某个人的文章 首先声明了一个事实,docker容器的-m,kubernets的-limits都可以用来限制内存。当进程使用的内存超过限制时,会收到内核发来的KILL信号。但是JVM完全不知道自己运行在容器内。 那么就有了一个问题“JVM内存超过容器限制的内存会怎样”。 作者做了一个实验,实验流程如下。使用如下命令启动了一个jboss的wildfly服务器,内存限制是50m docker run -it –name mywildfly -m=50m jboss/wildfly docker state 显示的信息如下 但是在一会后,Wildfly容器执行被中断,然后打印出信息如下 *** JBossAS process (55) received KILL signal *** 执行 docker inspect mywildfly -f ‘{{json .State}}' 查看容器信息 注意到 OOMKilled=true
然后作者又做了另外一个样例。使用springboot开接口生成字符串。(启动参数加上 -XX:+PrintFlagsFinal ) docker run -it --rm --name mycontainer150 -p 8080:8080 -m 150M rafabene/java-container:openjdk 然后发生一个神奇的现象,-m=150m,但是JVM最大内存却到了241.7MB,内存使用219.8MB。 俩个问题。 1.为什么最大内存是241.7MB 2.-m=150M,为什么允许Java内存到220MB? 根据JVM9的自动设置参数文档,最大堆内存表示物理内存的四分之一。因为JVM感知不到容器的存在,所以会使用宿主机的信息来计算,如下查看参数信息 docker logs mycontainer150|grep -i MaxHeapSize uintx MaxHeapSize := 262144000 {product} -m150m,为什么Java能开到220MB?根据Docker文档,-m150m表示限制物理内存150M和150M虚拟内存。所以,俩个加起来总共是300M。这就是Java没有收到Kill的原因。 回到刚开始的问题。“JVM内存超过容器限制的内存会怎样”。会被Kill掉,那么如何让JVM感知到容器内存的限制? 解决方案: 使用 fabric8/java-jboss-openjdk8-jdk 镜像(此镜像已经废弃,最新的是这个),意思是这个镜像会使用脚本计算容器的限制,并且只使用可用内存的百分之50。 注意:是百分之50,刚好是物理内存的限制,这样JVM是最优的,没有内存页被交换到磁盘。 Dockerfile如下 FROM fabric8/java-jboss-openjdk8-jdk:1.4.0 ENV JAVA_APP_JAR java-container.jar ENV AB_OFF true EXPOSE 8080 ADD target/$JAVA_APP_JAR /deployments/
下面是Java9的解决方案。 如果你使用Java9,你可以显示设置JVM参数,-XX:+UnlockExperimentalVMOptions ,-XX:+UseCGroupMemoryLimitForHeap 来让JVM自动配置读取到CGgroups的真实内存值。 注意:此时还是使用物理内存值的四分之一。 $ docker run -d --name mycontainer8g-jdk9 -p 8080:8080 -m 600M rafabene/java-container:openjdk-cgroup $ docker logs mycontainer8g-jdk9|grep MaxHeapSize size_t MaxHeapSize = 157286400 {product} {ergonomic}
下面是Java10的解决方案。 如果你使用Java10自动解决了这个,能自动感知到运行在容器内。那么-XX:+UnlockExperimentalVMOptions ,-XX:+UseCGroupMemoryLimitForHeap 这俩个参数就可以不要了。 如果加上这个参数,会看到如下警告 Option UseCGroupMemoryLimitForHeap was deprecated in version 10.0 and will likely be removed in a future release. $ docker run -it --name mycontainer -p 8080:8080 -m 600M rafabene/java-container:openjdk10
原文链接
|
退出 订阅评论 我的博客
[Ctrl+Enter快捷键提交]
【推荐】跨平台组态\工控\仿真\CAD 50万行C++源码全开放免费下载!
【推荐】阿里云云大使特惠:新用户购ECS服务器1核2G最低价87元/年
【推荐】和开发者在一起:华为开发者社区,入驻博客园科技品牌专区
【推广】园子与爱卡汽车爱宝险合作,随手就可以买一份的百万医疗保险
· 理解ASP.NET Core - Host
· 妙用 background 实现花式文字效果
· Go 并发编程 -- 正确使用 goroutine
· 前端瓦片地图加载之塞尔达传说旷野之息
· 技术管理进阶 —— 关于成本优化与利益分配机制
· “外链”打通后的流量重塑:谁在害怕,谁在窃喜?(2021-09-18 12:16)
· 微软强制推行TPM 2.0,竟然是为了反作弊(2021-09-18 12:02)
· 为什么你的手机越来越不耐用了?(2021-09-18 11:50)
· 抖音和快手的下一站劲敌是B站?(2021-09-18 11:40)
· 北交所投资门槛降低至50万元,能激活流动性吗?(2021-09-18 11:29)
» 更多新闻...