【问题标题】:Java set maximum heap size (Xmx) as a fraction of physical memoryJava 将最大堆大小 (Xmx) 设置为物理内存的一部分
【发布时间】:2018-05-02 19:20:21
【问题描述】:

JDK 8中,默认的最大堆大小为

物理内存的 1/4 或 1GB

并且可以使用-Xmx 开关覆盖它:

您可以使用 -Xmx 命令行选项覆盖此默认设置。

Xmx 开关适用于字节,而不是分数。有没有一种简单的方法可以将最大堆设置为机器物理内存的 X%?

编辑:

你问为什么?嗯,首先,好奇心。我觉得奇怪的是,默认 Xmx 是根据物理内存的一小部分定义的,但只要我触摸它,它就是一个绝对值。其次,如果我将相同(或相似)的应用程序部署到两台不同的服务器,并且其中一台拥有更多物理内存,我希望可以选择自动获取 JVM 以利用额外内存。这并不总是有意义的,但有时确实如此。

显而易见的解决方案是使用 shell 脚本来检查可用空间量并计算 Xmx,但这似乎是一个笨拙的解决方案。我想用纯 Java 应该可以实现。

【问题讨论】:

  • 这可能是您在调用 Java 时必须要做的事情,因此是以平台相关的方式。
  • @OliverCharlesworth 这就是我的想法。但这很奇怪。默认值是根据物理内存的一小部分定义的,但没有将 1/4 更改为 1/3 或 1/2 的开关。
  • 由于您无法更改 HotSpot JVM 的堆大小,“纯Java”解决方案是使用链接问答中的技术来查找物理内存大小...然后启动一个新的 JVM。坦率地说,您最好使用“笨拙”的解决方案。

标签: java garbage-collection heap-memory


【解决方案1】:

Java 8u191 (October 16, 2018) 开始,有三个专用的 JVM 选项可以将堆大小控制为可用内存的一小部分。它们记录在here

请注意,与它的名字所暗示的相反,MinRAMPercentage 设置最大堆大小

-XX:InitialRAMPercentage=percent

在应用人体工程学启发式之前,将 JVM 用于 Java 堆的初始内存量设置为 -XX:MaxRAM 选项中所述确定的最大内存量的百分比。默认值为 1.5625%。

-XX:MaxRAMPercentage=percent

在应用人体工程学启发法之前,将 JVM 可用于 Java 堆的最大内存量设置为 -XX:MaxRAM 选项中所述确定的最大内存量的百分比。默认值为 25%。

-XX:MinRAMPercentage=percent

在应用人体工程学启发法之前,将 JVM 可用于 Java 堆的最大内存量设置为按小堆的 -XX:MaxRAM 选项中所述确定的最大内存量的百分比。小堆是大约 125 MB 的堆。默认值为 50%。

以下是一些使用 docker 在 x64 上使用 jdk 11u10 运行的示例:

docker run --memory <limit> openjdk:11 java -XX:MaxRAMPercentage=25 -XX:MinRAMPercentage=50 -XX:InitialRAMPercentage=5 -XX:+PrintFlagsFinal 2>&1 | grep HeapSize

| Memory Limit | Initial Heap Size | Max Heap Size    |
|--------------|-------------------|------------------|
| 100Mi        | 10485760 (~10%)   | 52428800 (~50%)  |
| 256Mi        | 27262976 (~10%)   | 132120576 (~50%) |
| 512Mi        | 54525952 (~10%)   | 134217728 (~25%) |
| 1Gi          | 109051904 (~10%)  | 268435456 (~25%) |

【讨论】:

    【解决方案2】:

    你可能必须自己做。假设您要购买Windows版本, 获取最大内存量(解析 wmic ComputerSystem get TotalPhysicalMemory 之类的内容),计算其中的 1/4 并将其设置为 -Xmx 选项...

    我想问你为什么需要一定百分比的物理内存。最大内存量不应该影响你的应用程序的内存使用,如果是这样,应用程序应该自己处理它

    【讨论】:

    • 对于“我想问你为什么需要一定百分比的物理内存”这个问题。一个示例可能是具有可变渲染距离的游戏。如果可用内存不多,它将选择较小的渲染距离。但如果有大量内存可用,则可以选择较大的渲染距离
    猜你喜欢
    • 2011-08-29
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 2015-04-08
    • 2021-11-18
    • 2018-03-14
    相关资源
    最近更新 更多