docker使用问题-容器不明原因关闭,没有产生JVM dump

本文介绍了在Docker容器中运行的Java应用由于内存不足自动关闭的问题,即使配置了OOM时导出dump也无法找到文件。原因是JVM未识别其在容器内的环境,导致实际内存使用超出容器限制。解决方法是删除-Xmx参数,并添加-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap以及-XX:MaxRAMPercentage=XX.0参数,使得JVM根据Docker的cgroup限制调整内存使用,避免容器被OOM Kill。
摘要由CSDN通过智能技术生成

问题描述

docker 容器部署的java应用,经过一段时间后,出现自行关闭的情况。

我猜测是oom导致,所以已配置oom时导出dump。

奇怪的事情发生了,再次出现自行关闭情况后,找不到dump文件。

找到原因

  • JVM不知道自己位于容器中,则JVM heap可分配的最大内存空间为Xmx的配置值。
  • 容器中只部署一个JVM,通常Xmx的配置值 与 分配给容器的内存 大小相差无几。
  • 其他占用内存的空间,如metaspace,docker容器本身以及运行在其中的操作系统。

当heap逐渐增加的过程中,可能还没有出现OOM,但是加上其他空间占用的内存,已经超过容器内存,这是容器被关闭。

解决办法 

删除JVM启动参数

-Xmx

添加JVM启动参数 

-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMPercentage=占用比例,如80.0,必须浮点数

作用

-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap

要求8u131+,这些标志强制JVM检查Linux的cgroup配置,Docker是通过cgroup来实现最大内存设置的。

现在,如果你的应用到达了Docker设置的限制(比如500MB),JVM是可以看到这个限制的。

JVM将会尝试GC操作。如果仍然超过内存限制,JVM就会做它该做的事情,抛出OutOfMemoryException。

-XX:MaxRAMPercentage 控制最大堆内存占容器内存的比例,必须浮点数。

例子

-server -XX:+UseG1GC -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMPercentage=90.0 -Xms初始heap大小 -XX:NewRatio=2 -XX:+PrintGCDetails -XX:+PrintHeapAtGC -Xloggc:gc.log的位置 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=dump文件位置 -jar xxxx.jar --spring.profiles.active=prod

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值