【问题标题】:How is the default maximum heap size of an Oracle Java 7 JVM calculated?如何计算 Oracle Java 7 JVM 的默认最大堆大小?
【发布时间】:2015-02-17 04:25:06
【问题描述】:

根据GC ergonomics,默认的最大堆大小应该是“小于物理内存的 1/4 或 1GB”。

读到我希望 jvm 在具有 96GB 内存的服务器级机器上的默认最大堆大小为 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。怎么会?

【问题讨论】:

  • 什么是 Xmx 参数设置来调用 java main ?
  • 它还指出:为堆大小指定的边界和分数对于 J2SE 5.0 是正确的。随着计算机变得更强大,它们在后续版本中可能会有所不同。 .也许他们只是忘记调整文档
  • 好吧,文档确实提到了使用并行垃圾收集器时的具体情况;那是配置的吗? Java 7 的发行说明特别提到默认参数也发生了变化:docs.oracle.com/javase/7/docs/technotes/guides/vm/…
  • @ChristianDietrich 没有 Xmx 参数,问题是关于默认的最大堆大小。

标签: java jvm


【解决方案1】:

答案仅在您的问题中 -

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

【讨论】:

  • 作为母语为英语的人,文档中的声明意味着“1GB,如果小于 1GB,则为总物理内存的 1/4”。短语是“X 或 Y 中的较小者”,即两个选项中的哪个值较小。
  • 这是正确的,我相信这是客户端 JVM 过去的行为方式(也许现在仍然如此?);服务器 JVM 可以要求更多。但我必须承认,我找不到任何确凿的证据证明它在 Java 7/8 中的具体工作原理。
  • 从 Java 8 开始,上面的代码是错误的。它给了我整个系统内存。这是正确的:stackoverflow.com/a/12807848/4182868
【解决方案2】:

好的,我可能有found an answer

那个链接页面提到了java“SE-5.0”并且没有提到“64-bit”,也许它已经过时了?

这是一个更新的等价物:

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 来说,这似乎是准确的,所以我认为该链接已过时......

【讨论】:

    猜你喜欢
    • 2011-02-24
    • 2012-04-30
    • 2011-08-29
    • 1970-01-01
    • 2012-09-19
    • 2020-03-13
    • 2015-04-01
    • 2011-08-26
    相关资源
    最近更新 更多