【问题标题】:What is the difference between xmx and MaxRAM JVM parameters?xmlx 和 MaxRAM JVM 参数有什么区别?
【发布时间】:2020-07-24 02:33:18
【问题描述】:

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 另一个?

【问题讨论】:

    标签: java jvm heap-memory


    【解决方案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%;除非我在这里遗漏了一些明显的东西。
    猜你喜欢
    • 2015-03-05
    • 2011-03-27
    • 1970-01-01
    • 2019-08-19
    • 2011-02-18
    • 2010-09-14
    • 2020-05-25
    相关资源
    最近更新 更多