[英]How is the default maximum heap size of an Oracle Java 7 JVM calculated?
根據GC 人體工程學,默認的最大堆大小應該是“物理內存的 1/4 或 1GB 的小”。
讀到我希望具有 96GB ram 的服務器級機器上的 jvm 的默認最大堆大小為1GB
(96GB/4 = 24GB 或 1GB 中的較小者)。
然而,當我編譯並運行下面的代碼寫入了21463
(即約21GB
)。
public class Main{
public static void main(String[] args) {
System.out.println(Runtime.getRuntime().maxMemory() / 1024 / 1024);
}
}
萬一重要: java -version
產生
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)
總而言之,如果我正確閱讀了文檔,默認的最大堆大小應該不大於 1GB,但實際上它大約是服務器內存的 1/4。 怎么來的?
答案僅在第一行本身就在您的問題中-
默認的最大堆大小應該是物理內存的“1/4 的小” 。 在您的情況下,主內存的 1/4 為 24GB,但堆大小為 21GB,這滿足您的第一行語句。
為了更清楚地運行下面的代碼以獲得實際的主內存大小
public class SizeOfMainMemory {
public static void main(String[] args) {
com.sun.management.OperatingSystemMXBean mxbean = (com.sun.management.OperatingSystemMXBean) ManagementFactory
.getOperatingSystemMXBean();
System.out.println(mxbean.getTotalPhysicalMemorySize()/1024/1024);
}
}
你會發現你的HEAP SIZE 是你主內存的1/4或者可能更少。
好吧,我可能已經找到了答案。
那個鏈接頁面提到了java“SE-5.0”並且沒有提到“64位”,也許它是舊的?
這是一個更新的等價物:
https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/ergonomics.html
其中包含一個新鏈接“有關 64 位系統的初始堆和最大堆大小,請參閱並行收集器中的默認堆大小部分。”
在該頁面上: https : //docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/parallel.html#default_heap_size
它指出“在 64 位 JVM 上,如果有 128 GB 或更多的物理內存,默認的最大堆大小可以達到 32 GB。”
但是對於 JDK 7 似乎也是如此,所以我認為該鏈接已過時...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.