[英]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.