威哥评:这篇文章是我的小伙伴hwang根据他在production环境遇到的实际问题整理的,简单来说就是让JVM听你的话,说内存多大就多大。说实话,hwang这篇文章给我了一个小小的惊喜,他的文笔真是不错,很生动的技术文章。
所谓的容器应用内存溢出被杀死,即为oom(out of memory) killed exit code 137。
初次遭遇
相信玩java容器化部署的朋友肯定遇到过oom killed exit code 137,解决方案很多,糙快猛的就重启或者直接docker run --restart=always。去年第一次遇到的时候,哈哈,是秀一下自己还知道点jvm调优的时候了:
docker run … JAVA_OPTS=“-server -Xmx1024m”
顺道还长了点其它知识,
docker run … --memory1300MJAVA_OPTS=“-server -Xmx1024m”
容器的内存要大于Xmx内存,此前有不知道的同学配置失误导致启动失败,宣导之。以为从此可以高枕无忧了。
服务又挂了
岂料,好景仅半年,近日频遭下游业务方投诉,你们的服务又双叒叕不能用了!去现场扫了一眼,oom killed exit code 137。太好了,又可以jvm调优了。于是再给配上heapdump
docker run … --memory1300MJAVA_OPTS=“-server -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/logs/”
服务很配合的一两天就又挂了。再去现场,咦,我的heapdump呢?为什么日志文件夹下除