Java 8中的默认Xmxsize(最大堆大小)


80

oracle文档中,我发现:

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

这是什么系统配置是什么意思?


1
这意味着,如果您的系统具有16 GB的RAM,则其大小将大于512 MB的大小。
JB Nizet

谢谢,还有多大?
维塔利


3
>>物理内存的1/4或1GB较小。谢谢,@ alfasin。
维塔利

4
@Vitaly-Xmx至少在Java 8中似乎不支持1Gb限制,因为在我的Linux 64位系统上,总内存为6Gb,默认情况下,我的jvm具有-Xmx = 1.5Gb。
Eric Wang

Answers:


142

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

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

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

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

java -XX:+PrintFlagsFinal -version

它为您提供了一个清单,-Xmx位于中MaxHeapSize-Xms位于中InitialHeapSize。过滤您的输出(例如,|grep在Linux上)或将其保存在文件中,以便您可以在其中搜索。


10
作为一个小的补充,您可以运行java -XX:+PrintCommandLineFlags以打印出JVM根据当前系统信息选择的堆大小(和其他信息)
Cristian Vat 2015年

1
@CristianVat是的,但是参数是-XX:+PrintFlagsFinal,您建议的参数对我不起作用。将其添加到答案。
icza 2015年

-XX:+PrintFlagsFinal是的,对不起是最好的选择,因为考虑到所有因素后,它应该显示所有信息(包括手动选项和人体工程学)。虽然-XX:+PrintCommandLineFlags似乎可以在我的JVM上运行(可能取决于确切的版本)
Cristian Vat 2015年

2
对于大盒子,这种“ 1 / 4th RAM”经验法则绝对不成立。在4插槽,每个套接字服务器64gb(即256gb RAM)上,Xmx默认为〜32gb。32gb也可能与CompressedOops的局限性有关。
FauxFaux 2015年

2
仅打印与堆大小有关的行:java -XX:+PrintFlagsFinal -version | grep HeapSize
Eric Wang

37

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

Java8client占用您的Xmssize(最小堆大小)的物理内存的1/64的较大值,以及占用您的-Xmxsize(最大堆大小)的物理内存的1/4的较小值。

这意味着,如果您具有8GB RAM的物理内存,则将具有Xmssize8 *(1/6)的大号-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/…根据此链接,最小/初始的默认值为1/64而不是1/6。“机器上物理内存的
1/64的较大

15

令人惊讶的是,这个问题没有确定的书面答案。也许另一个数据点将为寻找答案的其他人提供价值。在运行CentOS(6.8,7.3)和Java 8(内部版本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}

在具有16 Gb RAM的系统中:2069889024 = 2 Gb。
david.perez

具有8 GB RAM的Windows 7 64位:32位JVM:256 MB,64位JVM:2 GB
golimar

最终找到了它的文档:stackoverflow.com/a/56036202/32453
rogerdpack

2

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


2
在我看来,OpenJDK和Oracle具有不同的特性-我看到OpenJDK始终都使用1/4 RAM作为-Xmx(从来都不是1/4和1GB中的较小者)
pogul

1

截至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)Client jvm的默认最大堆大小为256mb(有一个例外,请从上面的链接中读取)。

2)Server jvm的默认最大堆大小为32位,而64位为32gb(同样,这里也有例外。请从链接中读取)。

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


1
最后,链接到实际文档,以解释发生了什么情况。
rogerdpack
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.