百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

容器化环境中,JVM最佳参数配置实践

csdh11 2025-03-03 18:11 1 浏览

本文分享自华为云社区《Java应用容器化参数配置最佳实践-云社区-华为云》,作者:可以交个朋友。

简介

当你在物理机或者虚拟机上配置 JVM 参数时,JVM会默认使用主机上1/4的内存作为堆内存,你也可以选择使用-Xmx/-Xms 来指定 Java 堆内存大小。在容器化环境中,每个容器实例的内存大小由Cgroups配置决定,而低版本JVM对Cgroups的支持是不太友好的。本文主要探讨JVM最佳参数配置

JDK与Cgroups的适配关系

JDK 1.8.0_131之前的版本

使用jdk 1.8.0_121版本镜像启动容器实例,不指定参数情况下,无法识别Cgroups内存限制,使用主机1/4的内存作为最大堆内存

[root@172 ~]# free -m
               total        used        free      shared  buff/cache   available
Mem:            7196        2557         299         117        4338        4219
Swap:              0           0           0
[root@172 ~]# docker run -m 512Mi openjdk:8u121 java  -XshowSettings:vm -version VM
VM settings:
    Max. Heap Size (Estimated): 1.56G
    Ergonomics Machine Class: server
    Using VM: OpenJDK 64-Bit Server VM

openjdk version "1.8.0_121"
OpenJDK Runtime Environment (build 1.8.0_121-8u121-b13-1~bpo8+1-b13)
OpenJDK 64-Bit Server VM (build 25.121-b13, mixed mode)

使用-Xms-Xmx指定初始堆内存和最大堆内存,jvm能正常识别

[root@172 ~]# docker run -m 512Mi openjdk:8u121 java -Xms512m -Xmx512m -XshowSettings:vm -version VM
VM settings:
    Min. Heap Size: 512.00M
    Max. Heap Size: 512.00M
    Ergonomics Machine Class: server
    Using VM: OpenJDK 64-Bit Server VM

openjdk version "1.8.0_121"
OpenJDK Runtime Environment (build 1.8.0_121-8u121-b13-1~bpo8+1-b13)
OpenJDK 64-Bit Server VM (build 25.121-b13, mixed mode)

JDK 1.8.0_131版本

使用jdk 1.8.0_131版本镜像启动容器,不指定参数,无法识别Cgroups内存限制,使用主机1/4的内存作为最大堆内存

[root@172 ~]# docker run -m 512Mi openjdk:8u131 java  -XshowSettings:vm -version VM
VM settings:
    Max. Heap Size (Estimated): 1.56G
    Ergonomics Machine Class: server
    Using VM: OpenJDK 64-Bit Server VM

openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-8u131-b11-2-b11)
OpenJDK 64-Bit Server VM (build 25.131-b11, mixed mode)

使用-Xms和-Xmx指定初始堆内存和最大堆内存,jvm能正常识别

[root@172 ~]# docker run -m 512Mi openjdk:8u131 java -Xms512m -Xmx512m -XshowSettings:vm -version VM
VM settings:
    Min. Heap Size: 512.00M
    Max. Heap Size: 512.00M
    Ergonomics Machine Class: server
    Using VM: OpenJDK 64-Bit Server VM

openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-8u131-b11-2-b11)
OpenJDK 64-Bit Server VM (build 25.131-b11, mixed mode)

在jdk 1.8.0_131版本开始,加入了两个新参数-XX:+
UnlockExperimentalVMOptions
-XX:+
UseCGroupMemoryLimitForHeap
来动态感知容器的Cgroups内存限制,最大堆内存为Cgroups内存限制的1/4

[root@172 ~]# docker run -m 512Mi openjdk:8u131 java -XX:+UnlockExperimentalVMOptions  -XX:+UseCGroupMemoryLimitForHeap -XshowSettings:vm -version VM
VM settings:
    Max. Heap Size (Estimated): 114.00M
    Ergonomics Machine Class: server
    Using VM: OpenJDK 64-Bit Server VM

openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-8u131-b11-2-b11)
OpenJDK 64-Bit Server VM (build 25.131-b11, mixed mode)

新参数-XX:+
UnlockExperimentalVMOptions
-XX:+
UseCGroupMemoryLimitForHeap
虽然能动态感知Cgroups内存限制,但是却只能使用1/4,无法修改。此时可以使用另外两个参数-XX:MaxRAMFraction-XX:MinRAMFraction参数值必须为整数,取值参考如下表格:


MaxRAMFraction/MinRAMFraction取值

Cgroups内存限制的百分比

1

90%

2

50%

3

33%

4

25%

[root@172 ~]# docker run -m 512Mi openjdk:8u131 java -XX:+UnlockExperimentalVMOptions  -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=2 -XshowSettings:vm -version VM
VM settings:
    Max. Heap Size (Estimated): 228.00M
    Ergonomics Machine Class: server
    Using VM: OpenJDK 64-Bit Server VM

openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-8u131-b11-2-b11)
OpenJDK 64-Bit Server VM (build 25.131-b11, mixed mode)

最大堆内存为Cgroups内存限制的50%,符合预期

JDK 1.8.0_191版本

使用jdk 1.8.0_191版本镜像启动容器,不指定参数,jvm能动态感知Cgroups内存限制,最大堆内存为Cgroups内存限制的1/4

[root@172 ~]# docker run -m 512Mi openjdk:8u191-alpine java  -XshowSettings:vm -version VM
VM settings:
    Max. Heap Size (Estimated): 123.75M
    Ergonomics Machine Class: server
    Using VM: OpenJDK 64-Bit Server VM

openjdk version "1.8.0_191"
OpenJDK Runtime Environment (IcedTea 3.10.0) (Alpine 8.191.12-r0)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)

使用-Xms-Xmx指定初始堆内存和最大堆内存,符合预期

[root@172 ~]# docker run -m 512Mi openjdk:8u191-alpine java -Xms512m -Xmx512m -XshowSettings:vm -version VM
VM settings:
    Min. Heap Size: 512.00M
    Max. Heap Size: 512.00M
    Ergonomics Machine Class: server
    Using VM: OpenJDK 64-Bit Server VM

openjdk version "1.8.0_191"
OpenJDK Runtime Environment (IcedTea 3.10.0) (Alpine 8.191.12-r0)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)

jdk 1.8.0_191版本开始,-XX:MaxRAMFraction-XX:MinRAMFraction被弃用,使用MaxRAMPercentageMinRAMPercentage来修改堆内存在Cgroups内存限制的占比,参数值是Double类型必须带小数点

[root@172 ~]# docker run -m 512Mi openjdk:8u191-alpine java -XX:MaxRAMPercentage=50.0 -XX:MinRAMPercentage=50.0 -XshowSettings:vm -version VM
VM settings:
    Max. Heap Size (Estimated): 247.50M
    Ergonomics Machine Class: server
    Using VM: OpenJDK 64-Bit Server VM

openjdk version "1.8.0_191"
OpenJDK Runtime Environment (IcedTea 3.10.0) (Alpine 8.191.12-r0)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)

总结

  • XmsXmx能适应所有JDK版本,但不能动态感知容器的Cgroups限制,且参数优先级最高,与其他参数一起配置时,其他参数不生效。
  • -XX:+UnlockExperimentalVMOptions-XX:+UseCGroupMemoryLimitForHeap在1.8.0_131版本开始启用,能动态感知容器的Cgroups限制,但最大堆内存只能使用容器Cgroups内存限制的1/4。
  • -XX:MaxRAMFraction-XX:MinRAMFraction在1.8.0_131版本开始启用,可以修改堆内存占容器Cgroups内存限制的百分比,但百分比的值不能自由指定(比如不能指定40%),在1.8.0_191版本开始弃用。
  • MaxRAMPercentageMinRAMPercentage在1.8.0_191版本开始启用,可以自定义修改堆内存占容器Cgroups内存限制的百分比。

以上仅适用于容器采用Cgroups v1版本,在Cgroups v2版本中jdk需要1.8.0_372、11.0.16及更高版本才能动态感知Cgroups的内存限制

JVM参数配置建议

  1. 使用容器感知的 JDK 版本。对于使用 Cgroup V1 的集群,需要升级至 1.8.0_191以及更高版本;对于使用 Cgroup V2 的集群,需要升级至 1.8.0_372、11.0.16及更高版本。
  2. 由于Java应用使用的总内存不仅仅只有堆内存,还有堆外内存和直接内存。所以设置容器内存上限时必须大于堆内存,应该按照 Java 进程使用的内存量上浮 20%~30% 设置容器内存 limit。如果初次运行程序,并不了解其实际内存使用量,可以先设置一个较大的 limit 让程序运行一段时间,根据监控获取实际平均使用值对容器内存 limit 进行调整。
  3. 如果在容器内仅运行一个Java 应用程序,则将初始堆大小与最大堆大小最好配置相等。如果不相等,JVM会根据堆内存使用量在Xms与Xmx之间动态修改堆内存大小,导致额外的系统开销和频繁的垃圾回收。
  4. 使用-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath参数,在JVM发生OOM时,自动生成dump文件。dump文件路径最好是持久化挂载路径避免容器重启dump文件丢失。

关注#华为云开发者联盟# 点击下方,第一时间了解华为云新鲜技术~

华为云博客_大数据博客_AI博客_云计算博客_开发者中心-华为云

相关推荐

Excel表格技巧—如何保留小数点后两位

在我们日常使用Ofiiceexcel中,经常会用到小数点保留,对此人们习惯性会使用单元格格式设置,不过这种办法并不是真正的四舍五入,而只是改变了excel的显示。我们下面要介绍的这个方式是利用函数做...

小数的意义和性质(十四)

27、在一个两位小数的末尾添上一个0,与原来小数相比,多了1107个计数单位,这个小数原来是多少?举个例子:0.35的末尾添上一个0,就变成了0.350,0.35里有35个0.01,0.350里有35...

必看!文职人员等级标志及有关问题20条!

来源:中国民兵微信公众号大道至简!为了让大家更多了解文职政策、报考文职的粉丝们最快、最直接掌握政策。首先是上独家解读和壁纸。然后,结合独家资料,梳理出20条有关文职的干货,快快收藏吧!1.文职人员的身...

小学数学单元知识体系概述-五年级《小数除法》

一、网络图二、知识点梳理及举例说明1.除数是整数。1)除到被除数的末尾没有余数,能除尽。举例:22.4÷4。...

“分数,小数,百分数 的互化”我这样教学,学生很快就学会了。

这部分知识千万不能忽视,用途可大了。我们在进行分数,小数,百分数四则混合运算时,不会三者之间的转化,很难把题计算准确。那么三者之间怎样转化呢?其实就这么几步:一,分数化小数,用分数的分子除以分数的分...

求小数近似数的最大值和最小值的技巧

例:一个两位小数,四舍五入后的近似数是5.0,这个三位小数最大可能是(),最小可能是()。分析:保留一位小数要看百分位上的数和5比较,若小于5的数舍去;若≥5的数,向前一位进一。四舍是最大,五入是...

实验室检测双乙酰的操作步骤

双乙酰学名是2,3丁二酮,是啤酒发酵过程中酵母自身代谢产生的一种副产物,当双乙酰的含量在浅色啤酒中超过0.15mg/L时,就会使啤酒产生一种令人不愉快的馊饭味,严重影响啤酒的质量和口感,在啤酒中双乙酰...

快来看!玉溪2020年中考分数段出炉

8月7日市教育体育局公布玉溪市2020年初中学业水平考试分数段据介绍,今年,玉溪市普通高中学校招生文化成绩满分为600分(不含照顾加分),由初中学业水平考试的13个学科成绩折算而得,总分累加保留两位小...

截取近似值的方法有几种?在生活中怎样应用这些方法?(21)

根据生活中的实际情况,截取近似值的方法有以下三种:(1)、四舍五入法:...

Excel数值取整及进位

取整数函数907.5;1034.2;1500要改变为908;1035;1500公式为:=CEILING(A1,1)907;1034;1500要改变为910;1040;1500公式为:...

C语言sprintf函数详解:“字符串魔法师”

♂?一句话理解sprintf「将数据按‘魔法咒语’(格式字符串)格式化,并将结果‘封印’到一个字符数组中!」...

sql server 数字四舍五入 保留两位小数

1.使用Round()函数,如Round(@num,2),其中参数2表示保留两位有效数字。缺点:Round()只是负责四舍五入到两位小数,但是不负责去掉后面的0。...

excel表格保留两位小数怎么保留?教您4种设置方法

保留两位小数怎么保留?有4种解决方法,我们来具体演示一下。·方法一:选择需要设置的单元格,然后点击开始菜单,数字功能区,点击增加小数位数或者是减少小数位数,调到保留两位就可以了。·方法二:选择需要设置...

如何对数字进行四舍五入,进一法,去尾法,精度法等不同方式取舍

指定位数取有效位针对数值我们有不同的处理方式,比如保留一位小数位,保留两位小数位,保留整数位等,一般我们都是采用四舍五入...

保留n位小数的函数公式

在日常办公中,Excel和WPS是我们处理数据的得力助手。今天,我们将介绍几个常用的函数,帮助你在数据处理中事半功倍。...