参考资料: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. 第三部分_Shell脚本简单四则运算

    简单四则运算 算术运算:默认情况下,shell就只能支持简单的整数运算 运算内容:加(+).减(-).乘(*).除(/).求余数(%) 1. 四则运算符号 表达式 举例 $(( )) | echo $ ...

  2. 中断操作:AbortController学习笔记

    前端面试一般喜欢问: 请手写一个带取消功能的延迟函数,axios 取消功能的原理是什么? 如何中断请求fetch的原理分析和应用? 在看来<使用 AbortController 终止 fetch ...

  3. 开心档之C++ 数据结构

    C++ 数据结构 C/C++ 数组允许定义可存储相同类型数据项的变量,但是结构是 C++ 中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项. 结构用于表示一条记录,假设您想要跟踪图书馆 ...

  4. A/B实验背后的秘密:样本量计算

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 一.前言 背景: AB实验具有一定前瞻性,统计性,科学性的特性.用好了就实现了在大数据时代的充分利用数据分析问题, ...

  5. 解密Prompt系列23.大模型幻觉分类&归因&检测&缓解方案脑图全梳理

    上一章我们主要聊聊RAG场景下的幻觉检测和解决方案,这一章我们单独针对大模型的幻觉问题,从幻觉类型,幻觉来源,幻觉检测,幻觉缓解这四个方向进行整理.这里就不细说任意一种方法了,因为说不完根本说不完,索 ...

  6. 收到邮件了,微软新必应(New Bing)可以用了,只隔了一天

    收到邮件了,微软新必应(New Bing)可以用了,只隔了一天 国内申请微软新必应(New Bing) 1号我写了一篇文章,介绍内置ChatGPT的微软新必应(New Bing)申请方法,没想到昨天就 ...

  7. 2019年第十届蓝桥杯国赛C++A组

    蓝桥杯历年国赛真题汇总:Here 最后编辑时间: 2021年5月27日 统一声明 如果不写默认带有常用头文件 如果不表明主函数默认表示在 void solve(){} 默认使用 using names ...

  8. Codeforces Round #669 (Div. 2) A、B题题解

    Problem A - Ahahahahahahahaha https://codeforces.com/contest/1407/problem/A 题意: 给定一个偶数数组(元素值 0,1),在删 ...

  9. 多倍图切图cutterman

  10. echart自定义主题

    echart默认以canvas展示,放大会模糊,可以使用svg格式.