千家信息网

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

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,本文小编为大家详细介绍"容器环境的JVM内存如何设置",内容详细,步骤清晰,细节处理妥当,希望这篇"容器环境的JVM内存如何设置"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧
千家信息网最后更新 2026年10月31日容器环境的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安全错误 数据库的锁怎样保障安全 科技互联网 南京欣网互联网络科技有限公司 哈尔滨大商圈互联网科技有限公司 互联网科技工作委员会副主任毛军 智能科技公司是互联网公司吗 互联网科技与金融科技 高科技与互联网 互联网金融 科技创新 互联网公司会议桌创意科技软装饰 荆州市昕露互联网络科技有限公司 移动互联网科技公司 互联网5g黑科技有哪些 想开互联网科技公司怎么样 互联网科技融合创新 广州有谷有贝互联网科技有限公司 北京互联网科技类企业分布 广州三三互联网科技有限公司 杭州融税互联网科技有限公司 恒生科技互联网指数十大成分股 互联网科技企业文化 互联网科技公司的优势 科技互联网技术 汇久创客互联网科技 互联网科技大会案例 互联网科技类展会 农村开互联网科技讲堂 宁夏众和广鑫互联网科技有限公司 互联网风格科技公司名称 吉林省码上互联网科技电话 瑞安市蟠桃会互联网科技有限公司
0