JVM不会分配使用-Xmx参数定义的所有内存

5ssjco0h  于 2022-11-07  发布在  其他
关注(0)|答案(1)|浏览(151)

我有一个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

ukdjmx9f

ukdjmx9f1#

显然,JVM运行并行或串行GC,其中堆的年轻一代由Eden和两个Survivor空间组成(请参见Generations)。
JVM会将其中一个Survivor空间保留为空:应用程序不能同时使用这两个空间。因此,Runtime.maxMemory不包括一个Survivor空间的大小(在您的情况下似乎是15 MB)。
其他GC算法的表现方式不同,例如,如果您运行-XX:+UseG1GC的JVM,Runtime.maxMemory所显示的最大可用内存将等于-Xmx(更准确地说,由于alignment,它将是466 MB)。

相关问题