如何确定默认的java堆大小?

如果我从java命令行省略-Xmxn选项,则使用默认值。 根据java文档 “默认值是在运行时根据系统configurationselect”。

什么系统configuration设置影响默认值?

在Windows系统上,可以使用以下命令找出运行应用程序的系统的默认值。

java -XX:+ PrintFlagsFinal -version | findstr HeapSize

-Xms查找选项MaxHeapSize (for -Xmx )和InitialHeapSize

在Unix / Linux系统上,你可以做

java -XX:+ PrintFlagsFinal -version | grep HeapSize

我相信结果输出是以字节为单位。

根据垃圾收集器人体工程学[甲骨文] :

初始堆大小:

机器物理内存的1/64更大或合理的最小值。 在J2SE 5.0之前,默认的初始堆大小是一个合理的最小值,因平台而异。 您可以使用-Xms命令行选项覆盖此默认值。

最大堆大小:

较小的物理内存的四分之一或1GB。 在J2SE 5.0之前,默认的最大堆大小是64MB。 您可以使用-Xmx命令行选项覆盖此默认值。

更新:

正如汤姆·安德森(Tom Anderson)在评论中所指出的那样,上述是针对服务器级机器的。 从5.0 JavaTM虚拟机中的人机工程学 :

在J2SE平台版本5.0中,被称为服务器级机器的一类机器已被定义为一台机器

  • 2个或更多物理处理器
  • 2或更多GB的物理内存

除了运行Windows操作系统版本的32位平台之外。 在所有其他平台上,默认值与版本1.4.2的默认值相同。

在J2SE平台版本1.4.2中,默认情况下进行了以下select

  • 初始堆大小为4 MB
  • 最大堆大小为64 MB

这是随着Java 6更新18更改。http://www.oracle.com/technetwork/java/javase/6u18-142093.html

假设我们有超过1GB的物理内存(这些日子相当普遍),它总是物理内存的四分之一。

埃内斯托是对的。 根据他发布的链接[1]:

更新了客户端JVM堆configuration

在客户端JVM中…

  • 默认的最大堆大小是物理内存的一半,直到物理内存大小为192 MB,否则为物理内存的四分之一直到1 GB的物理内存大小。

    例如,如果您的计算机具有128兆字节的物理内存,则最大堆大小为64兆字节,而大于或等于1千兆字节的物理内存会导致最大堆大小为256兆字节。

  • 除非您的程序创build了足够的对象来请求JVM,否则最大的堆大小实际上不会被JVM使用。 在JVM初始化过程中分配的数量小得多,称为初始堆大小。 …

  • 除了32位JVM的缺省最大堆大小为1千兆字节 (对应于4千兆字节的物理内存大小)以及64位JVM的32千兆字节之外,服务器JVM堆configuration人机工程学现在与客户端相同到128千兆字节的物理内存大小。

[1] http://www.oracle.com/technetwork/java/javase/6u18-142093.html

默认值是在运行时根据系统configurationselect的

看看文档页面

默认堆大小

除非在命令行中指定了初始和最大堆大小,否则将根据机器上的内存量计算。

  1. 客户端JVM默认初始和最大堆大小:

    默认的最大堆大小是物理内存的一半,直到物理内存大小为192 MB ,否则为物理内存的四分之一,直到物理内存大小为1 GB

  2. 服务器JVM默认初始和最大堆大小:

    在32位JVM上, 如果物理内存为4 GB或更多,默认的最大堆大小可以高达1 GB在64位JVM上,如果有128 GB或更多的物理内存,默认的最大堆大小可以高达32 GB

什么系统configuration设置影响默认值?

您可以使用标志-Xms (初始堆大小)和-Xmx (最大堆大小)指定初始堆大小和最大堆大小。 如果您知道您的应用程序需要多less堆才能正常工作,则可以将-Xms-Xmx设置为相同的值

对于IBM jvm,命令如下:

 java -verbose:sizes -version 

有关IBM SDK for Java 8的更多信息 – http://www-01.ibm.com/support/knowledgecenter/SSYKE2_8.0.0/com.ibm.java.lnx.80.doc/diag/appendixes/defaults.html?郎= EN

Java8为您的Xmssize(最小HeapSize)占用了1/6的物理内存,而对于-Xmxsize(Maximum HeapSize)则占用了物理内存的1/4。

您可以通过以下方式检查默认的Java堆大小

Windows中

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

Linux中

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

什么系统configuration设置影响默认值?

你的物理内存和你的Java版本。