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

What is the default max heap size (-Xmx) in Java 8?

the oracle documentation中我发现:

-Xmxsize Specifies the maximum size (in bytes) of the memory allocation pool in bytes ... The default value is chosen at runtime based on system configuration.

系统配置是什么意思?

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

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

另外Java配置选项(命令行参数)可以"outsourced"到环境变量,包括-Xmx,它可以改变默认值(意思是指定一个新的默认值)。具体来说,JAVA_TOOL_OPTIONS 环境变量由所有 Java 工具检查并在存在时使用(更多详细信息 here and here)。

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

java -XX:+PrintFlagsFinal -version

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

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

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

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

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

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

uintx MaxHeapSize                                  := 16873684992      {product}

如您所述,默认 -Xmxsize(最大堆大小)取决于您的系统配置。

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

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

您可以使用

检查您的默认堆大小

Windows:

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

Linux:

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

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

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

截至 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 位服务器 jvm 的默认最大堆大小为 32gb(这里也有例外。请从链接中阅读)。

所以默认最大 jvm 堆大小为:256mb1gb32gb 取决于上面的虚拟机。