我有一个jar文件,我用一个systemd
单元文件来运行它。单元文件中的运行命令如下:
/usr/bin/java -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
我的应用程序总是记录允许使用的最大RAM量。它使用以下代码记录:
public static int ONE_MEGABYTE_IN_BYTES = 1048576;
Runtime runtime = Runtime.getRuntime();
int maximumJVMHeapAllocation = Math.round(runtime.maxMemory() / oneMegabyteInBytes);
由于某些原因,runtime.maxMemory()
的值总是比-Xmx
参数的值小大约15mb
。因此,如果jar文件使用-Xmx465m
参数运行,则应用程序将只获得450mb
的可用RAM内存。
我的问题是:RAM
中剩余的15 mb用于什么?是否用于堆栈内存?
编辑:避免混淆;服务器可用的RAM总量为1GB
。其中512MB
由操作系统使用Amazon Linux 2
。
1条答案
按热度按时间ukdjmx9f1#
显然,JVM运行并行或串行GC,其中堆的年轻一代由Eden和两个Survivor空间组成(请参见Generations)。
JVM会将其中一个Survivor空间保留为空:应用程序不能同时使用这两个空间。因此,
Runtime.maxMemory
不包括一个Survivor空间的大小(在您的情况下似乎是15 MB)。其他GC算法的表现方式不同,例如,如果您运行
-XX:+UseG1GC
的JVM,Runtime.maxMemory
所显示的最大可用内存将等于-Xmx
(更准确地说,由于alignment,它将是466 MB)。