千家信息网

容器环境的JVM内存如何设置

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,本文小编为大家详细介绍"容器环境的JVM内存如何设置",内容详细,步骤清晰,细节处理妥当,希望这篇"容器环境的JVM内存如何设置"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧
千家信息网最后更新 2025年11月07日容器环境的JVM内存如何设置

本文小编为大家详细介绍"容器环境的JVM内存如何设置",内容详细,步骤清晰,细节处理妥当,希望这篇"容器环境的JVM内存如何设置"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

Java Heap基础知识

默认情况下,jvm自动分配的heap大小取决于机器配置,比如我们到一台64G内存服务器:

java -XX:+PrintFlagsFinal -version | grep -Ei "maxheapsize|maxram"    uintx DefaultMaxRAMFraction                     = 4                                   {product}    uintx MaxHeapSize                              := 16875782144                         {product} uint64_t MaxRAM                                    = 137438953472                        {pd product}    uintx MaxRAMFraction                            = 4                                   {product}   double MaxRAMPercentage                          = 25.000000                           {product}java version "1.8.0_192"Java(TM) SE Runtime Environment (build 1.8.0_192-b12)Java HotSpot(TM) 64-Bit Server VM (build 25.192-b12, mixed mode)

可以看到,JVM 分配的最大MaxHeapSize为 16G,计算公式如下:

MaxHeapSize = MaxRAM * 1 / MaxRAMFraction

MaxRAMFraction 默认是4,意味着,每个jvm最多使用25%的机器内存。

但是需要注意的是,JVM实际使用的内存会比heap内存大:

JVM内存  = heap 内存 + 线程stack内存 (XSS) * 线程数 + 启动开销(constant overhead)

默认的XSS通常在256KB到1MB,也就是说每个线程会分配最少256K额外的内存,constant overhead是JVM分配的其他内存。

我们可以通过-Xmx 指定最大堆大小。

java -XX:+PrintFlagsFinal -Xmx1g -version | grep -Ei "maxheapsize|maxram"    uintx DefaultMaxRAMFraction                     = 4                                   {product}    uintx MaxHeapSize                              := 1073741824                          {product} uint64_t MaxRAM                                    = 137438953472                        {pd product}    uintx MaxRAMFraction                            = 4                                   {product}   double MaxRAMPercentage                          = 25.000000                           {product}java version "1.8.0_192"Java(TM) SE Runtime Environment (build 1.8.0_192-b12)Java HotSpot(TM) 64-Bit Server VM (build 25.192-b12, mixed mode)

此外,还可以使用XX:MaxRAM来指定。

java -XX:+PrintFlagsFinal -XX:MaxRAM=1g -version | grep -Ei

但是指定-Xmx或者MaxRAM需要了解机器的内存,更好的方式是设置MaxRAMFraction,以下是不同的Fraction对应的可用内存比例:

+----------------+-------------------+
| MaxRAMFraction | % of RAM for heap |
|----------------+-------------------|
| 1 | 100% |
| 2 | 50% |
| 3 | 33% |
| 4 | 25% |
+----------------+-------------------+

容器环境的Java Heap

容器环境,由于java获取不到容器的内存限制,只能获取到服务器的配置:

$ docker run --rm alpine free -m             total     used     free   shared  buffers   cachedMem:          1998     1565      432        0        8     1244$ docker run --rm -m 256m alpine free -m             total     used     free   shared  buffers   cachedMem:          1998     1552      445        1        8     1244

这样容易引起不必要问题,例如限制容器使用100M内存,但是jvm根据服务器配置来分配初始化内存,导致java进程超过容器限制被kill掉。为了解决这个问题,可以设置-Xmx或者MaxRAM来解决,但就想第一部分描述的一样,这样太不优雅了!

为了解决这个问题,Java 10 引入了 +UseContainerSupport(默认情况下启用),通过这个特性,可以使得JVM在容器环境分配合理的堆内存。 并且,在JDK8U191版本之后,这个功能引入到了JDK 8,而JDK 8是广为使用的JDK版本。

UseContainerSupport

-XX:+UseContainerSupport允许JVM 从主机读取cgroup限制,例如可用的CPU和RAM,并进行相应的配置。这样当容器超过内存限制时,会抛出OOM异常,而不是杀死容器。
该特性在Java 8u191 +,10及更高版本上可用。

注意,在191版本后,-XX:{Min|Max}RAMFraction 被弃用,引入了-XX:MaxRAMPercentage,其值介于0.0到100.0之间,默认值为25.0。

最佳实践

拉取最新的openjdk:8-jre-alpine作为底包,截止这篇博客,最新的版本是212,>191

docker run -it --rm openjdk:8-jre-alpine java -versionopenjdk version "1.8.0_212"OpenJDK Runtime Environment (IcedTea 3.12.0) (Alpine 8.212.04-r0)OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)

我们构建一个基础镜像,dockerfile如下:

FROM openjdk:8-jre-alpineMAINTAINER jadepengRUN echo "http://mirrors.aliyun.com/alpine/v3.6/main" > /etc/apk/repositories \    && echo "http://mirrors.aliyun.com/alpine/v3.6/community" >> /etc/apk/repositories \    && apk update upgrade \    && apk add --no-cache procps unzip curl bash tzdata \    && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \    && echo "Asia/Shanghai" > /etc/timezoneRUN apk add --update ttf-dejavu && rm -rf /var/cache/apk/*

在应用的启动参数,设置 -XX:+UseContainerSupport,设置-XX:MaxRAMPercentage=75.0,这样为其他进程(debug、监控)留下足够的内存空间,又不会太浪费RAM。

读到这里,这篇"容器环境的JVM内存如何设置"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。

内存 容器 环境 分配 版本 限制 配置 文章 服务器 机器 线程 问题 服务 内容 基础 大小 情况 特性 知识 进程 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 信息网络安全监管工作 一种基于图数据库的商品推荐算法 电脑插服务器就开机慢 怎么样配置数据库 上海嵌入式软件开发报价 深圳市聚橙网络技术有限公司领先 安全生产软件开发 热血三国都有哪些服务器啊 网络技术服务口号 梦幻西游选择服务器 网络安全防护技术书籍 海康存储服务器提示硬盘未认证 建党一百周年移动网络安全保障 火狐浏览器服务器在哪里打开 sas如何调取数据库 零基础学网络安全视屏教学哪里有 服务器系统安全加固软件 广西华为数字服务器 网站管理系统软件开发 断电后服务器ip变了 网络安全工程师工作怎样 面向对象软件开发英文文献 网络安全工程师的学习方法 服务器空间划分管理方法 小敏家数据库系统概念 深圳市聚橙网络技术有限公司领先 勇帝网络技术服务工作室 数据库中修改库 软件开发需要的许可证 数据库mdf文件查看
0