[英]JVM does not allocate all memory that is defined with -Xmx argument
我有一个使用systemd
单元文件运行的 jar 文件。 单元文件中的运行命令如下:
ExecStart=/usr/bin/java -Xms200m -Xmx465m --enable-preview -jar myapp-1.0.0.jar
我的应用程序始终记录允许使用的最大 RAM 量。 它使用以下代码记录这一点:
public static int ONE_MEGABYTE_IN_BYTES = 1048576;
Runtime runtime = Runtime.getRuntime();
int maximumJVMHeapAllocation = Math.round(runtime.maxMemory() / oneMegabyteInBytes);
由于某种原因, runtime.maxMemory()
的值总是比-Xmx
参数的值小15mb
左右。 因此,如果使用参数-Xmx465m
运行 jar 文件,则应用程序将仅获得450mb
的可用 RAM memory。
我的问题是:剩余的 15 mb RAM
有什么用? 用于堆栈 memory 吗?
编辑:为避免混淆; 服务器可用的 RAM 总量为1GB
。 其中512MB
由操作系统Amazon Linux 2
使用。
显然,JVM 与并行或串行 GC 一起运行,其中堆的年轻代由 Eden 和两个幸存者空间组成(请参阅Generations )。
JVM 将幸存者空间之一保持为空:应用程序不能同时使用两者。 因此, Runtime.maxMemory
不包括一个 Survivor 空间的大小(在您的情况下似乎是 15 MB)。
其他 GC 算法的行为不同。 For example, if you run JVM with -XX:+UseG1GC
, the maximum available memory as shown by Runtime.maxMemory
will be equal to -Xmx
(more precisely, it'll be 466 MB because of the alignment ).
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.