簡體   English   中英

如何計算 Oracle Java 7 JVM 的默認最大堆大小?

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

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