根据 GC ergonomics默认的最大堆大小应该是“小于物理内存的 1/4 或 1GB”。
读到我希望具有 96GB 内存的服务器级机器上的 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 - Oracle Java 7 JVM 的默认最大堆大小是如何计算的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27545627/