xmlx 和 MaxRAM JVM 参数有啥区别?
Posted
技术标签:
【中文标题】xmlx 和 MaxRAM JVM 参数有啥区别?【英文标题】:What is the difference between xmx and MaxRAM JVM parameters?xmlx 和 MaxRAM JVM 参数有什么区别? 【发布时间】:2019-06-01 23:09:38 【问题描述】:MaxRAM:
基于机器上的内存量。用于堆的内存比例由命令行选项 InitialRAMFraction 和 MaxRAMFraction 控制 [...] MaxRAM 的值取决于平台。
Xmx:
-Xmxn 指定内存分配池的最大大小(以字节为单位)。此值必须是大于 2MB 的 1024 的倍数。附加字母 k 或 K 表示千字节,或附加 m 或 M 表示兆字节。默认值为 64MB。此值的上限在 Solaris 7 和 Solaris 8 SPARC 平台上约为 4000m,在 Solaris 2.6 和 x86 平台上约为 2000m,减去开销。
据我了解,两者都定义了heap
大小。不?推荐使用什么:Xmx
或MaxRAM
?如果我同时使用哪一个 ovverides 另一个?
【问题讨论】:
【参考方案1】:-Xmx
指定堆的精确上限。这是设置堆大小的首选方式。
-XX:MaxRAM
不直接定义堆大小。相反,在根据人体工程学计算堆限制时,此参数会覆盖物理 RAM 的实际数量。
如果设置了-Xmx
,则永远不会使用MaxRAM
。否则最大堆大小估计1为
MaxHeapSize = MaxRAM * MaxRAMPercentage / 100% (default MaxRAMPercentage=25)
1实际的algorithm要复杂一些,还要看其他参数。
【讨论】:
这是设置堆大小的首选方式,除非这是在容器中启动的,对吧?在这种情况下,InitialRAMPercentage
和 MaxRAMPercentage
将是您最好的选择。我说的对吗?
@Eugene Preferences 是主观的 :) 在我看来,堆大小应该总是明确设置。尤其是在容器中。我可以根据我们自己在 12000 多个容器中运行数百个 Java 服务的经验来证明这一说法是正确的,但这对于评论来说太长了。
我的演示文稿Memory Footprint of a Java Process 可能会给出提示。简而言之:影响足迹的因素已经太多了,所以你几乎不想在内存方程中再添加一个不可控的变量。
非常有趣的一点,我唯一不喜欢的是,如果您指定-Xmx
和-Xms
,您还需要为docker
正确指定-m
。如果你在像我这样的公司工作,制作 docker 镜像并不意味着你可以控制它们的启动位置和启动者;我想我应该在一开始就明确地说出来。
我对你的观点有点困惑。我同意这一点:Xmx = cgroup_mem_limit * MaxRAMPercentage / 100
(大致),但这不是重点吗?如果您不直接指定Xmx
,但指定docker -m
和 MaxRAMPercentage=80.0
- 例如,您将获得-m
的80%;除非我在这里遗漏了一些明显的东西。以上是关于xmlx 和 MaxRAM JVM 参数有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章