如何计算Oracle Java 7 JVM的默认最大堆大小?

时间:2014-12-18 11:33:28

标签: java jvm

根据GC ergonomics,默认的最大堆大小应为"小于物理内存的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。怎么样?

2 个答案:

答案 0 :(得分:6)

答案在你的问题中仅在第一行本身 -

默认最大堆大小应为物理内存的“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 ,或者可能会少一些。

答案 1 :(得分:0)

好的,我可能有found an answer

该链接页面提到了Java“ SE-5.0”,却没有提及“ 64位”,也许是过时了?

以下是更新的等效项:

https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/ergonomics.html

其中带有新链接“有关64位系统的初始堆和最大堆大小,请参阅Parallel Collector中的默认堆大小部分。”

在该页面上: https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/parallel.html#default_heap_size

它指出 “在64位JVM上,如果有128 GB或更多的物理内存,则默认的最大堆大小最多可以达到32 GB。”

但是对于JDK 7来说似乎同样正确,所以我认为该链接已过时...