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

How is the default Java heap size determined?

如果我omit -Xmxn从Java的命令行选项的默认值将被使用,然后A。根据Java文档

"the default value is chosen at runtime based on system configuration"

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


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

java -XX:+PrintFlagsFinal -version | findstr HeapSize

查找选项MaxHeapSize(用于-Xmx)和InitialHeapSize(用于-Xms)。

在UNIX/Linux系统上,您可以

java -XX:+PrintFlagsFinal -version | grep HeapSize

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


根据垃圾收集器人体工程学[Oracle]:

initial heap size:

Larger of 1/64th of the machine's physical memory on the machine or some
reasonable minimum. Before J2SE 5.0,
the default initial heap size was a
reasonable minimum, which varies by
platform. You can override this
default using the -Xms command-line
option.

maximum heap size:

Smaller of 1/4th of the physical memory or 1GB. Before J2SE 5.0, the
default maximum heap size was 64MB.
You can override this default using
the -Xmx command-line option.

更新:

正如Tom Anderson在他的评论中指出的,上面是针对服务器级机器的。从5.0 JavaTM虚拟机中的人机工程学:

In the J2SE platform version 5.0 a
class of machine referred to as a
server-class machine has been defined
as a machine with

  • 2 or more physical processors
  • 2 or more Gbytes of physical memory

with the exception of 32 bit platforms
running a version of the Windows
operating system. On all other
platforms the default values are the
same as the default values for version
1.4.2.

In the J2SE platform version 1.4.2 by
default the following selections were
made

  • initial heap size of 4 Mbyte
  • maximum heap size of 64 Mbyte


这在Java 6更新18中被更改。

假设我们有超过1 GB的物理内存(现在很常见),它总是占您物理内存的1/4。


Java 8为您的XMLSE(最小HeAPeSIZE)占用了超过1/第六的物理内存,而对于X-XMXSIZE(最大HeAPSIZE)来说,物理内存不足1/第四。

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

在Windows中:

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

在Linux:

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

What system configuration settings influence the default value?

您的物理内存和Java版本。


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

Updated Client JVM heap configuration

In the Client JVM...

  • The default maximum heap size is half of the physical memory up to a physical memory size of 192 megabytes and otherwise one fourth of the physical memory up to a physical memory size of 1 gigabyte.

    For example, if your machine has 128 megabytes of physical memory, then the maximum heap size is 64 megabytes, and greater than or equal to 1 gigabyte of physical memory results in a maximum heap size of 256 megabytes.

  • The maximum heap size is not actually used by the JVM unless your program creates enough objects to require it. A much smaller amount, termed the initial heap size, is allocated during JVM initialization. ...

  • ...
  • Server JVM heap configuration ergonomics are now the same as the Client, except that the default maximum heap size for 32-bit JVMs is 1 gigabyte, corresponding to a physical memory size of 4 gigabytes, and for 64-bit JVMs is 32 gigabytes, corresponding to a physical memory size of 128 gigabytes.

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


default value is chosen at runtime based on system configuration

查看文档页面

Default Heap Size

Unless the initial and maximum heap sizes are specified on the command line, they are calculated based on the amount of memory on the machine.

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

    默认的最大堆大小为物理内存的一半,最大物理内存大小为192兆字节(MB),否则为物理内存的四分之一,最大物理内存大小为1千兆字节(GB)。

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

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

  • What system configuration settings influence the default value?

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


    对于IBM JVM,命令如下:

    1
    java -verbose:sizes -version

    有关Java 8的IBM SDK的更多信息:HTTP://www-01.bM.COM/Spopt/EnguleCeCurs/SysKe2y0.0.0/COM.IbM.java. Lnx.80.DOC/Diga/AppDeNeXeS/DeFults.HTML?朗恩


    许多参数影响生成大小。下图说明了堆中提交空间和虚拟空间之间的区别。在虚拟机初始化时,将保留堆的整个空间。保留空间的大小可以通过-Xmx选项指定。如果-Xms参数的值小于-Xmx参数的值,则不会立即将保留的所有空间提交给虚拟机。未提交的空间在此图中标记为"虚拟"。堆的不同部分(永久一代、终身一代和年轻一代)可以根据需要增长到虚拟空间的极限。

    enter image description here

    默认情况下,虚拟机在每个集合中增大或缩小堆,以尝试将每个集合中活动对象的可用空间比例保持在特定范围内。此目标范围由参数-XX:MinHeapFreeRatio=-XX:MaxHeapFreeRatio=设定为百分比,总大小以-Xms以下为界,以-Xmx以上为界。

    参数默认值

    最小自由比40

    最大堆自由比70

    XMS3670K

    XMX 64米

    64位系统上堆大小参数的默认值已放大约30%。这个增加是为了补偿64位系统上较大的对象大小。

    使用这些参数,如果一代中的可用空间百分比低于40%,则将扩展该代以保持40%的可用空间,直至达到该代的最大允许大小。同样,如果自由空间超过70%,发电将收缩,因此只有70%的空间是自由的,这取决于发电的最小规模。

    大型服务器应用程序在使用这些默认值时通常会遇到两个问题。一种是启动缓慢,因为初始堆很小,必须在许多主要集合上调整大小。更紧迫的问题是,对于大多数服务器应用程序,默认的最大堆大小不合理地小。服务器应用程序的经验规则是:

    • 除非暂停有问题,否则尝试授予对虚拟机是可能的。默认大小(64MB)通常也是小的。
    • 将-xms和-xmx设置为相同的值将增加可预测性从虚拟机中删除最重要的大小调整决定。但是,如果您一个糟糕的选择
    • 一般来说,当您增加处理器,因为分配可以并行化。

      有整篇文章


    EDCOX1×7和EDCOX1×8是Java虚拟机(JVM)的标志:

    • Xmsinitial and minimumJVM heap size
      • Format-Xmx[g|G|m|M|k|K]
      • Default Size
        • -server模式:25%的空闲物理内存,>=8MB,<=64MB
        • -client mode:25%的空闲物理内存,大于等于8MB,小于等于16MB
      • Typical Size
        • -Xms128M
        • -Xms256M
        • -Xms512M
      • Function/Effect
        • ->JVM从分配Xms大小的内存开始
    • XmxmaximumJVM heap size
      • Format-Xmx[g|G|m|M|k|K]
      • Default Size
        • <= R27.2
          • Windows:总物理内存的75%1GB
          • Linux/Solaris:可用物理内存的50%1GB
        • >= R27.3
          • Windows X64:总物理内存的75%2GB
          • Linux/Solaris X64:可用物理内存的50%2GB
          • Windows x86:总物理内存的75%1GB
          • Linux/Solaris X86:可用物理内存的50%1GB
      • Typical Size
        • -Xmx1g
        • -Xmx2084M
        • -Xmx4g
        • -Xmx6g
        • -Xmx8g
      • Function/Effect
        • ->jvm允许使用Xmx大小内存的最大值
          • 当超过Xmx时,java.lang.OutOfMemoryError是否
            • 如何修复OutOfMemoryError
              • 超过Xmx
                • 例如:从-Xmx4g-Xmx8g

    更多细节

    参见官方文档-x命令行选项