在 JDK 8 中,默认最大堆大小为
物理内存的1/4或1GB
并且可以使用
-Xmx
开关覆盖它:
您可以使用 -Xmx 命令行选项覆盖此默认值。
Xmx
开关适用于字节,而不是分数。是否有一种直接的方法将最大堆设置为机器物理内存的X%?
编辑:
你问为什么?嗯,首先是好奇心。我觉得很奇怪,默认的 Xmx 是根据物理内存的一小部分定义的,但是一旦我触摸它,它就会突然变成一个绝对值。其次,如果我将相同(或类似)的应用程序部署到两台不同的服务器,并且其中一台具有更多的物理内存,我希望能够选择自动让 JVM 利用额外的内存。它并不总是有意义,但有时确实有意义。
显而易见的解决方案是使用 shell 脚本来检查可用空间量并计算 Xmx,但这似乎是一个笨拙的解决方案。我想用纯 Java 应该可以实现。
自 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%) |
您可能必须自己做。假设你要使用 Windows 版本, 获取最大内存量(解析类似
wmic ComputerSystem get TotalPhysicalMemory
的内容),计算其中的 1/4 并将其设置为 -Xmx 选项...
我想问你为什么需要一定比例的物理内存。最大内存量不应该影响应用程序的内存使用量,如果是这样,应用程序应该自行处理它