Springboot容器化镜像设置堆内存大小

参考资料:Best Practices: Java Memory Arguments for Containers - DZone Java 

有三种方式设置最大堆内存大小:

1. -Xmx

2. -XX:MaxRAMFraction, -XX:MinRAMFraction

3.-XX:MaxRAMPercentage, -XX:MinRAMPercentage

一、-Xmx

这种方式很直接,适用于所有JAVA版本:

java -Xmx512m -jar app.jar

设置最大堆内存大小为512M。 

二、-XX:MaxRAMFraction, -XX:MinRAMFraction

只适用于 Java8-131 -190版本(本人未测试该方法)

java -XX:MaxRAMFraction=2 -jar app.jar

按照开头文章中介绍,MaxRAMFraction=2代表将使用容器总内存的1/2作为JVM的最大堆内存。

三、-XX:MaxRAMPercentage, -XX:MinRAMPercentage

适用于Java8-191以上版本(已验证测试)

java -XX:MaxRAMPercentage=70.0 -jar app.jar

MaxRAMPercentage=70.0代表将使用容器的resources.limit.memory值的70%作为JVM的最大堆内存(注意70必须加.0,否则JVM将启动失败:日志里报Improperly specified VM option错误)

四、验证-XX:MaxRAMPercentage过程

Dockerfile中设置MaxRAMPercentage=70.0

测试JDK版本:1.8小版本号为275:

(另:在不使用MaxRAMPercentage参数时,该版本JDK将默认使用1/4的resources.limit.memory作为JVM的堆内存大小)

 k8s deployment中resource设置:

JVM堆内存大小:

1.5G * 1024 * 70% 约等于1076MB,符合预期结果。

五、总结

  • 根据容器中JDK版本选择合适的方式设置JVM进程堆内存大小
  • JDK1.8从191小版本开始,-XX:+UseContainerSupport作为JVM的默认参数,所以假如不配任何堆内存参数,则默认使用容器的1/4作为JVM的堆内存大小
  • 不太推荐手动设置-Xmx,每修改一次需要重新打镜像,不如用另外两种方式设置堆内存大小,直接修改resource limit方便
  • 建议使用容器的70%内存作为JVM堆内存大小,剩余30%留给堆外内存使用,防止OOM Kill容器
  • -XX:MinRAMFraction和-XX:MinRAMPercentage并不是代表设置最小堆内存大小,如果你的容器内存大于250M则使用Maxxxx设置最大堆内存大小,如果小于250M则使用Minxxx设置最大堆内存大小

 ====================================================================

如有不对的理解,欢迎指正~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值