docker Java 应用堆内存配置
引言
本文主要是讲解 InitialRAMPercentage、MinRAMPercentage, MaxRAMPercentage 三个 JVM 参数之间的区别。参数由 Java 8 update 191 引入,主要是用于配置运行在物理机或者容器中的 Java 应用堆内存大小。
InitialRAMPercentage
-XX:InitialRAMPercentage
用于配置堆的初始化大小。假如物理机或者容器的内存大小(limit 限制)为 1 GB, -XX:InitialRAMPercentage=25
,那么堆内存大小大概为 250 MB(1 GB 的 25%)。
当 -Xms
参数未指定时,-XX:InitialRAMPercentage
用于配置堆的初始化大小。如果指定了 -Xms
,-XX:InitialRAMPercentage
将会被 JVM 忽略。
MaxRAMPercentage
、MinRAMPercentage
以上两个参数主要用于配置堆的最大内存大小(JDK 的开发团队起的名字 -XX:MinRAMPercentage
很容易让人理解为是堆的最小内存大小,然而并不是)。
如果你的物理机(或容器)内存小于 250 MB(大约),那么 -XX:MinRAMPercentage
参数用于配置应用堆的最大内存大小。假如物理机内存大小为 100MB,-XX:MinRAMPercentage=50
,那么应用的最大堆内存大小为 50 MB。
当你的物理机(或容器)的内存大于 250 MB(大约),-XX:MaxRAMPercentage
参数将用于配置应用堆的最大内存大小。
我们举两个例子来验证以上结论:
-
例 1:较小的宿主机内存
我们把容器的内存限制为 100 MB,MaxRAMPercentage
配置为 25, **MinRAMPercentage ** 配置为 50。那么由于宿主机的内存 100 MB 小于 250 MB,所以后者的配置应该生效,也就是如图所示,应用的最大堆大小为 48.38 MB(100 MB 的 50%)。从该例子中看出 MaxRAMPercentage
被忽略。
docker run -m 100MB openjdk:10 java -XX:MaxRAMPercentage=25 -XX:MinRAMPercentage=50 -XshowSettings:vm -version
VM settings:
Max. Heap Size (Estimated): 48.38M
Using VM: OpenJDK 64-Bit Server VM
-
例 2:较大的宿主机内存
我们把容器的内存限制改为 1 GB,MaxRAMPercentage 配置为 25, MinRAMPercentage 配置为 50。我们看到实际的应用堆最大大小为 247.50 MB(由于宿主机内存大于 250 MB,所以前者配置生效)。
docker run -m 1GB openjdk:10 java -XX:MaxRAMPercentage=25 -XX:MinRAMPercentage=50 -XshowSettings:vm -version
VM settings:
Max. Heap Size (Estimated): 247.50M
Using VM: OpenJDK 64-Bit Server VM
当 -Xmx 未指定时,-XX:MaxRAMPercentage 及 -XX:MinRAMPercentage 用于配置堆的最大内存大小。如果 -Xmx 指定了,那么以上两个参数将会被 JVM 忽略。如图:
docker run -m 1GB openjdk:10 java -XX:MaxRAMPercentage=25 -XX:MinRAMPercentage=25 -Xmx512m -XshowSettings:vm -version
VM settings:
Max. Heap Size: 512.00M
Using VM: OpenJDK 64-Bit Server VM
-Xmx512m、-XX:MaxRAMPercentage=25、-XX:MinRAMPercentage=25 同时指定了,但是只有 -Xmx512m 起到了作用。
结论
- 用 -XX:InitialRAMPercentage 配置你的应用堆初始化内存大小(前提是 -Xms 未配置)。
- -XX:MinRAMPercentage、-XX:MaxRAMPercentage 用于配置最大堆大小(前提是 -Xmx 未配置)。
- -XX:MaxRAMPercentage 应用于大多场景,毕竟主流的企业级 Java 应用内存已经超过了 250 MB。除非构建的是微型应用,物理机内存小于 250 MB,你才需要使用 -XX:MinRAMPercentage。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)