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

标签 java jvm

根据 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/

相关文章:

java - 通过 HTTPS 网络加密/解密

java - EAP 6.1 中的类加载问题 - JBoss 7.2/WAR 类看不到 EAR 类

Java管道,为什么我在从管道读取时被无限期地阻塞

logging - 使用 wsadmin 检索 Websphere JVM 日志

java - 为什么操作系统说它有足够的内存时不能分配内存给jvm

java - 使用 Spring 数据 JDBC 时未找到 JdbcSQLSyntaxErrorException 列

java - JTable单元格更新问题

java - 处理 JVM 崩溃

java - JVM 是否与操作系统保持时间同步?

jvm - Gradle 应用程序插件 : How can I run jvm application with -javaagent options?