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

use*_*408 3 java jvm

根据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);
        }
}
Run Code Online (Sandbox Code Playgroud)

如果重要: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)
Run Code Online (Sandbox Code Playgroud)

总而言之,如果我正确阅读文档,默认的最大堆大小应该不大于1GB,但实际上它大约是服务器内存的1/4.怎么会?

Bec*_*tor 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);
    }

}
Run Code Online (Sandbox Code Playgroud)

你会发现你的HEAP SIZE是主内存的1/4或者可能少一点.

  • 作为母语为英语的人,文档中的陈述意味着"1GB,即总体物理内存的1/4,如果小于1GB".短语是"X或Y中较小的",即两个选项中较小的值中的任何一个. (3认同)
  • 很好的回答bector (2认同)