Java 将最大堆大小 (Xmx) 设置为物理内存的一部分

问题描述 投票:0回答:2

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

物理内存的1/4或1GB

并且可以使用

-Xmx
开关覆盖它:

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

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

编辑:

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

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

java garbage-collection heap-memory
2个回答
9
投票

Java 8u191(2018 年 10 月 16 日) 起,存在三个专用 JVM 选项来控制堆大小作为可用内存的一部分。它们记录在here

请注意,与它的名字所暗示的相反,

MinRAMPercentage
还控制最大堆大小

-XX:初始RAM百分比=百分比

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

-XX:MaxRAMPercentage=百分比

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

-XX:MinRAMPercentage=百分比

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

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

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%) |

0
投票

您可能必须自己做。假设你要使用 Windows 版本, 获取最大内存量(解析类似

wmic ComputerSystem get TotalPhysicalMemory
的内容),计算其中的 1/4 并将其设置为 -Xmx 选项...

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

© www.soinside.com 2019 - 2024. All rights reserved.