簡體   English   中英

JVM 不分配使用 -Xmx 參數定義的所有 memory

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM