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

Java将最大堆大小(Xmx)设置为物理内存的一部分,java,garbage-collection,heap-memory,Java,Garbage Collection,Heap Memory,在中,默认的最大堆大小为 物理内存的1/4或1GB 并且可以使用-Xmx开关将其覆盖: 您可以使用-Xmx命令行选项覆盖此默认值 Xmx开关使用字节,而不是分数。是否有一种简单的方法将最大堆设置为机器物理内存的X% 编辑: 为什么,你问?首先,好奇。我觉得很奇怪,默认的Xmx是用物理内存的一小部分来定义的,但只要我一碰它,它就是一个绝对值。其次,如果我将相同(或类似)的应用程序部署到两个不同的服务器上,并且其中一个服务器具有更多的物理内存,那么我希望可以选择自动让JVM利用额外的内存。这并不总是

在中,默认的最大堆大小为

物理内存的1/4或1GB

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

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

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

编辑:

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


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

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

我想问你为什么需要一定比例的物理内存。最大内存量不应该影响应用程序的内存使用,如果是这样,应用程序应该自己处理它,因为有三个专用的JVM选项可以控制堆大小作为可用内存的一部分。它们被记录在案

请注意,与其名称相反,
MinRAMPercentage
设置最大堆大小

-XX:InitialRAMPercentage=百分比

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

-XX:MaxRAMPercentage=百分比

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

-XX:MinRAMPercentage=百分比

设置JVM可用于Java堆的最大内存量,然后再应用符合人体工程学的启发式方法,作为小堆的-XX:MaxRAM选项中所述的最大内存量的百分比。小堆是大约125MB的堆。默认值为50%

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

docker运行——内存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%) |

这可能是在任何调用Java的程序中都必须要做的事情,因此是以依赖于平台的方式进行的。@OliverCharlesworth我就是这么想的。但这很奇怪。默认值是根据物理内存的一小部分定义的,但是没有将1/4更改为1/3或1/2的开关。由于您无法更改热点JVM的堆大小,“纯Java”解决方案是使用链接Q&a中的技术来查找物理内存大小。。。然后启动一个新的JVM。坦白地说,你的“笨重”解决方案会更好。对于“我想问你为什么你需要一定比例的物理内存”这个问题。例如,具有可变渲染距离的游戏。如果可用内存不足,它将选择较小的渲染距离。但如果有大量内存可用,则可以选择较大的渲染距离