线上docker服务频繁自动重启解决过程

1 原因分析

线上配置的重要配置参数为:

最大堆内存最小堆内存docker内存
2G2G2G

可以看到堆内存和docker配置的内存一样大。docker内存分配=docker使用+JVM堆使+Matespace元数据区,因为JVM感知获取不到docker内存限制,docker限制内存为2G的话,能够分配给JVM堆内存必然小于2G,如果java需要申请2G内存的话必然无法通过,这时候docker进程会被宿主机杀死,docker容器就会不断重启

2 如何解决

为了适配docker,java10引入参数-XX:+UseContainerSupport,默认值为true,该参数能使JVM读取到可用的CUP、内存等资源。
通过MaxRAMPercentageInitialRAMPercentageMinRAMPercentage可以设置JVM能够使用容器内存占比,比如docker分配了1GB内存,设置的参数为-XX:InitialRAMPercentage=50.0 和 -XX:MaxRAMPercentage=80.0那么JVM启动使用堆内存为50%*1024=512MB,最大可用堆内存为80%*1024=819.2MB。-Xmx -Xms已经成为过时配置。
另外,java8将永久代移除了(所以-XX:PermSize和-XX:MaxPermSize也被移除了),使用matespace代替,-XX:MetaspaceSize和-XX:MaxMetaspaceSize用来设置元数据初始和最大值,默认初始值20M左右,最大值为-1,也就是不限制最大值,最大值仅跟宿主机剩余内存有关,如果不调整最大值,且在宿主机内存充足的情况下,matespace永远不会出现OOM。如果设置了最大值,当拓展到该值就会进行FGC。由于FGC代价高,建议两个值设置一样大,并且要比默认值大,例如:内存为4G就,设置为128M。如果MaxMetaspaceSize设置过小,可能会导致OOM错误

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值