参考资料: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设置最大堆内存大小

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

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

文章知识点与官方知识档案匹配,可进一步学习相关知识
Java技能树首页概览106788 人正在系统学习中

[转帖]Springboot容器化镜像设置堆内存大小的更多相关文章

  1. SpringBoot容器化的多环境配置

    SpringBoot容器化的多环境配置 部署通常会有多个环境,如"dev"/"test"/"prod"等环境 容器化部署通常使用环境变量,而 ...

  2. Heap堆的理解以及在IAR中如何设置堆的大小

    文章首发于浩瀚先森博客 堆栈的概念在脑海里已经存在有一段时间了,今天就测试来整理下Heap堆.栈以后再说. 堆区不像全局变量和局部变量总是有指定的内存大小,它是为了在程序运行时动态分配内存而设定的一块 ...

  3. Tomcat 设置JVM内存大小

    我的服务器的配置: # OS specific support.  $var _must_ be set to either true or false. JAVA_OPTS="-Xms10 ...

  4. docker启动 elasticsearch 修改 xmx xms 堆内存大小修改

    用docker 安装的elasticsearch 5.6版本默认堆内存最大设置的2G 可以通过如下方法修改 [root@nova-92 logs]# find /var/lib/docker/ -na ...

  5. RocketMQ_问题_启动报错,修改堆内存大小

    1.启动broker报错 虚拟机内存小,导致虚拟机中的JVM内存小,进而在启动broker时分配JVM内存遇到问题 查询网上得知,查看/usr/local/rocketmq-all-4.3.0/dis ...

  6. 用eclipse运行项目时怎么设置虚拟机内存大小

    方法一: 打开eclipse,选择Window--Preferences...在对话框左边的树上双击Java,再双击InstalledJREs,在右边选择前面有对勾的JRE,再单击右边的“Edit”按 ...

  7. tomcat服务器配置java堆内存大小

    我用的是绿色免安装的tomcat,找到tomcat下的bin文件夹下的catalina.bat文件: 编辑该文件,编辑参数,没有的话手动加上: set JAVA_OPTS=-server -Xms51 ...

  8. 设置共享内存大小 【windows】

    hMapFile = CreateFileMapping( INVALID_HANDLE_VALUE, // use paging file NULL, // default security PAG ...

  9. Linux Tomcat8 启动堆内存溢出

    今天在部署一个开源项目的时候,Tomcat8启动异常,报错信息: Exception in thread "RMI TCP Connection(idle)" java.lang. ...

  10. 【转】JVM 堆内存设置原理

    堆内存设置 原理 JVM堆内存分为2块:Permanent Space 和 Heap Space. Permanent 即 持久代(Permanent Generation),主要存放的是Java类定 ...

随机推荐

  1. webrtc实时视频语音实现

    webrtc介绍 WebRTC实现了基于网页的视频会议,标准是WHATWG 协议,目的是通过浏览器提供简单的javascript就可以达到实时通讯(Real-Time Communications ( ...

  2. Sermant:无代理服务网格架构解析及无门槛玩转插件开发

    本文分享自华为云社区<Sermant:无代理服务网格架构解析及无门槛玩转插件开发>,作者: 华为云社区精选 . 本期直播的主题是<从架构设计到开发实践,深入浅出了解Sermant&g ...

  3. 【技术控请进】华为云DevCloud深色模式开发解读

    引言 近期,华为云DevCloud推出了开发者友好的深色模式,深受开发者们的喜爱和关注.大家都知道,深色模式(Dark Mode)在iOS13 引入该特性后各大应用和网站都开始支持了深色模式.在这之前 ...

  4. 数仓无损压缩算法:gzip算法

    摘要:一种无损的压缩数据格式,是一个在类Unix上的一种文件解压缩软件. 本文分享自华为云社区<GaussDB(DWS) gzip算法简介>,作者:hw0086. [算法原理] gzip是 ...

  5. jQuery模糊匹配checkbox全选 value实现checkbox部分或全部全选

    本文章总结jQuery实现checkbox三种情况的全选功能 第一种:等值全选,也称name的等值全选,通过checkbox的名称name实现. 第二种:模糊全选,也称id模糊全选,通过checkbo ...

  6. 火山引擎 DataLeap:在数据研发中,如何提升效率?

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 在数仓及中台研发过程中,研发人员经常需要在不同任务中维护相同或类似代码,不仅费时费力,并且代码迭代后也面临不同业务 ...

  7. Mysql--between

    between 用于where 表达式中,选取介于两个值之间的数据范围,同and一起搭配使用 语法: expr [NOT] BETWEEN begin_expr AND end_expr; 在整个表达 ...

  8. PS CJ37/CJ38 增加和返回预算

    一.预算补充CJ37/预算返回CJ38 二.补充预算CJ37,点击保存 预算返回CJ38,点击保存 三.代码示例 预算补充代码 "------------------------------ ...

  9. ngix反向代理服务器

    Nginx ("engine x") 是一个高性能的HTTP 和反向代理 服务器,在大负载的情况下表现十分优秀. 1.正向代理 正向代理也是大家最常接触的到的代理模式.正向代理最大 ...

  10. P1825 诡异的题

    一道不难的题,可是挑了好久也没调好!因为最开始写的代码太复杂了,一大堆嵌套括号,其中有一个ny写成了nx一直没发现.后来用新定义变量取代了那些复杂的用函数."."和方括号表达出来的 ...