Java 8 中默认的最大堆大小 (-Xmx) 是多少?

Posted

技术标签:

【中文标题】Java 8 中默认的最大堆大小 (-Xmx) 是多少?【英文标题】:What is the default max heap size (-Xmx) in Java 8? 【发布时间】:2015-04-01 02:45:15 【问题描述】:

在the oracle documentation我发现:

-Xmxsize 指定内存分配池的最大大小(以字节为单位)...默认 值是在运行时根据系统配置选择的。

系统配置是什么意思?

【问题讨论】:

这意味着如果您的系统有 16 GB 的 RAM,则大小将大于 512 MB。 谢谢,要多大? 寻找“最大堆大小”here >>物理内存的 1/4 或 1GB 中的较小者。谢谢,@alfasin。 @Vitaly 1Gb 的限制似乎不适用于-Xmx,至少在 Java 8 中,因为在我的 linux 64 位系统上,总内存为 6Gb,我有一个 jvm 有 -Xmx =默认为 1.5Gb。 【参考方案1】:

它因实现和版本而异,但通常取决于使用的 VM(例如客户端或服务器,请参阅 -client-server 参数)以及您的系统内存。

对于client,默认值通常是物理内存的 1/4 或 1GB(以较小者为准)。

Java 配置选项(命令行参数)也可以“外包”给环境变量,包括 -Xmx,它可以更改默认值(意味着指定新的默认值)。具体来说,JAVA_TOOL_OPTIONS 环境变量由所有 Java 工具检查并在存在时使用(更多详细信息 here 和 here)。

您可以运行以下命令查看默认值:

java -XX:+PrintFlagsFinal -version

它给你一个很长的列表,-XmxMaxHeapSize-XmsInitialHeapSize。过滤您的输出(例如,Linux 上的|grep)或将其保存在文件中以便您可以在其中进行搜索。

【讨论】:

作为一个小补充,你可以运行java -XX:+PrintCommandLineFlags来打印出JVM根据当前系统信息选择的堆大小(和其他信息) @CristianVat 是的,但是参数是-XX:+PrintFlagsFinal,你建议的那个对我不起作用。将其添加到答案中。 对,对不起-XX:+PrintFlagsFinal 是最好的选择,因为它应该在考虑到一切(包括手动选项和人体工程学)后显示所有信息。虽然-XX:+PrintCommandLineFlags 似乎可以在我的 JVM 上运行(可能取决于确切的版本) 对于大盒子,这个“1/4 内存”的经验法则绝对不成立。在 4 插槽、每插槽 64gb 的服务器(即 256gb RAM)上,Xmx 默认为 ~32gb。 32gb 也可能与 CompressedOops 的限制有关。 这里只打印堆大小相关的行:java -XX:+PrintFlagsFinal -version | grep HeapSize【参考方案2】:

就像你提到的,默认的-Xmxsize(最大堆大小)取决于你的系统配置。

Java8 clientXmssize(最小堆大小)占用物理内存的 1/64 中的较大者,为 -Xmxsize(最大堆大小)占用物理内存的 1/4 中的较小者。

这意味着,如果您有 8GB RAM 的物理内存,您将拥有 Xmssize 作为 8*(1/64) 的较大者和 -Xmxsize 作为 8*(1/4) 的较小者。

您可以使用

检查您的默认 HeapSize

Windows中:

java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"

Linux 中:

java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'

这些默认值也可以覆盖到您想要的数量。

【讨论】:

参考:docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/… docs.oracle.com/javase/8/docs/technotes/guides/vm/… 根据此链接,最小值/初始值的默认值为 1/64 而不是 1/6。 “大于机器上机器物理内存的 1/64 或某个合理的最小值”【参考方案3】:

令人惊讶的是,这个问题没有明确的书面答案。也许另一个数据点会为寻找答案的其他人提供价值。在我运行 CentOS (6.8,7.3) 和 Java 8 (build 1.8.0_60-b27, 64-Bit Server) 的系统上:

默认内存为物理内存的 1/4,不受 1GB 限制。

此外,-XX:+PrintFlagsFinal 会打印到 STDERR,因此用于确定上述其他人提供的当前默认内存的命令应调整为以下内容:

java -XX:+PrintFlagsFinal 2>&1 | grep MaxHeapSize

在具有 64GB 物理 RAM 的系统上返回以下内容:

uintx MaxHeapSize                                  := 16873684992      product

【讨论】:

在我的 16 Gb RAM 系统中:2069889024 = 2 Gb。 Windows 7 64bit with 8 GB RAM: 32bit JVMs: 256 MB, 64bit JVMs: 2 GB 终于找到了它的文档:***.com/a/56036202/32453【参考方案4】:

在我的 Ubuntu VM 上,总 RAM 为 1048 MB,打印java -XX:+PrintFlagsFinal -version | grep HeapSizeuintx MaxHeapSize := 266338304,大约为 266MB,是我总 RAM 的 1/4。

【讨论】:

在我看来,OpenJDK 和 Oracle 具有不同的特性 - 我看到 OpenJDK 始终使用 1/4 的 RAM 作为 -Xmx(从来没有 1/4 和 1GB 中较小的那个)【参考方案5】:

截至 2019 年 5 月 8 日:

JVM堆大小取决于系统配置,含义:

a) 客户端 jvm 与服务器 jvm

b) 32 位与 64 位

链接:

1) 从 J2SE5.0 更新:https://docs.oracle.com/javase/6/docs/technotes/guides/vm/gc-ergonomics.html 2) 简要回答:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/ergonomics.html 3)详细解答:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/parallel.html#default_heap_size 4) 客户端与服务器:https://www.javacodegeeks.com/2011/07/jvm-options-client-vs-server.html

总结: (从上面的链接很难理解。所以在这里总结一下)

1) 客户端 jvm 的默认最大堆大小为 256mb(有一个例外,从上面的链接中读取)。

2) 32 位服务器 jvm 的默认最大堆大小为 1gb,64 位为 32gb(这里也有例外。请从链接中阅读)。

因此,默认的最大 jvm 堆大小为:256mb1gb32gb,具体取决于上述 VM。

【讨论】:

最后链接到解释发生了什么的真实文档。

以上是关于Java 8 中默认的最大堆大小 (-Xmx) 是多少?的主要内容,如果未能解决你的问题,请参考以下文章

JVM启动参数

如何指定 JVM 最大堆大小“-Xmx”以在 SBT 中运行具有“运行”操作的应用程序?

JVM优化

Java 32 位 Xmx 与 Java 64 位 Xmx

6个重要的JVM性能参数

JVM启动参数