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 大小。不?推荐使用什么:XmxMaxRAM?如果我同时使用哪一个 ovverides 另一个?

【问题讨论】:

【参考方案1】:

-Xmx 指定堆的精确上限。这是设置堆大小的首选方式。

-XX:MaxRAM 不直接定义堆大小。相反,在根据人体工程学计算堆限制时,此参数会覆盖物理 RAM 的实际数量。

如果设置了-Xmx,则永远不会使用MaxRAM。否则最大堆大小估计1

MaxHeapSize = MaxRAM * MaxRAMPercentage / 100% (default MaxRAMPercentage=25)

1实际的algorithm要复杂一些,还要看其他参数。

【讨论】:

这是设置堆大小的首选方式,除非这是在容器中启动的,对吧?在这种情况下,InitialRAMPercentageMaxRAMPercentage 将是您最好的选择。我说的对吗? @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 参数有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin JVM 和 Kotlin Native 有啥区别?

jdk和jre有啥区别?

VBS和JAVA和C++,有啥区别,有啥差距

JVM的内存中的堆和栈有啥区别呢?

参数和参数有啥区别? [复制]

实例和对象有啥区别?