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
它给你一个很长的列表,-Xmx
在MaxHeapSize
,-Xms
在InitialHeapSize
。过滤您的输出(例如 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 堆大小为:256mb 或 1gb 或 32gb 取决于上面的虚拟机。
在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
它给你一个很长的列表,-Xmx
在MaxHeapSize
,-Xms
在InitialHeapSize
。过滤您的输出(例如 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 堆大小为:256mb 或 1gb 或 32gb 取决于上面的虚拟机。