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

时间:2011-01-12 10:06:38

标签: java heap heap-memory

如果我从Java命令行中省略-Xmxn选项,则将使用默认值。根据{{​​3}}

  

“在运行时根据系统配置选择默认值”

哪些系统配置设置会影响默认值?

10 个答案:

答案 0 :(得分:450)

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

  

java -XX:+ PrintFlagsFinal -version | findstr HeapSize

MaxHeapSize寻找-Xmx(适用于InitialHeapSize)和-Xms的选项。

在Unix / Linux系统上,您可以

  

java -XX:+ PrintFlagsFinal -version | grep HeapSize

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

答案 1 :(得分:105)

根据Garbage Collector Ergonomics [Oracle]

  

初始堆大小:

     

机器或其他机器的物理内存的1/64   合理的最低限在J2SE 5.0之前,   默认的初始堆大小是a   合理的最小值,因而有所不同   平台。你可以覆盖它   默认使用-Xms命令行   选项。

     

最大堆大小:

     

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

<强>更新

汤姆安德森在评论中指出,上述内容适用于服务器级机器。来自Ergonomics in the 5.0 JavaTM Virtual Machine

  

在J2SE平台版本5.0中   机器类称为   服务器级机器已定义   作为

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

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

     

在J2SE平台版本1.4.2中   默认以下选项   由

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

答案 2 :(得分:28)

Java 6 update 18已更改此内容。

假设我们拥有超过 1 GB 的物理内存(这些日子很常见),它总是物理内存的1/4。

答案 3 :(得分:18)

Java 8占用物理内存的1/6以上用于Xmssize(最小HeapSize),少于物理内存的1/4用于-Xmxsize(最大HeapSize)。

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

Windows

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

Linux

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

哪些系统配置设置会影响默认值?

你的物理记忆&amp; Java版本。

答案 4 :(得分:15)

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

  

更新了客户端JVM堆配置

     

在客户端JVM中......

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

         

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

  •   
  • 除非您的程序创建足够的对象来要求它,否则JVM实际上不会使用最大堆大小。在JVM初始化期间分配了一个小得多的数量,称为初始堆大小。 ...

  •   
  • ...
  •   
  • 服务器JVM堆配置人机工程学现在与客户端相同,只是 32位JVM的默认最大堆大小为1千兆字节,对应物理内存大小为4千兆字节,并且对于64位JVM是32千兆字节,对应的物理内存大小为128千兆字节。
  •   

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

答案 5 :(得分:7)

对于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?lang=en

答案 6 :(得分:7)

  

默认值是在运行时根据系统配置选择的

查看文档page

  

默认堆大小

     

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

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

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

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

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

  3.   

    哪些系统配置设置会影响默认值?

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

答案 7 :(得分:4)

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

enter image description here

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

参数默认值

MinHeapFreeRatio 40

MaxHeapFreeRatio 70

-Xms 3670k

-Xmx 64m

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

使用这些参数,如果某代中的可用空间百分比降到40%以下,则该代将被扩展以保持40%的可用空间,直到该代最大允许的大小。同样,如果可用空间超过70%,则代将收缩,因此只有70%的空间可用,这取决于代的最小大小。

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

  • 除非您在暂停方面遇到问题,否则请尝试分配与 可能对虚拟机。默认大小通常为64MB 小。
  • 将-Xms和-Xmx设置为相同的值可提高可预测性 从虚拟机中删除最重要的规模决策。 但是,如果您这样做,虚拟机将无法补偿 一个糟糕的选择。
  • 通常,随着内存数量的增加而增加内存 处理器,因为分配可以并行化。

    full article

答案 8 :(得分:4)

最后!

从Java 8u191开始,您现在可以选择:

-XX:InitialRAMPercentage
-XX:MaxRAMPercentage
-XX:MinRAMPercentage

可用于按可用物理RAM的百分比确定堆大小。 (与安装的RAM相同,减去内核使用的内存)。

有关更多信息,请参见Release Notes for Java8 u191。请注意,这些选项是在Docker标题下提及的,但实际上无论您是在Docker环境中还是在传统环境中,它们都适用。

MaxRAMPercentage的默认值为25%。这是非常保守的。

我自己的规则:如果您的主机或多或少专用于运行给定的Java应用程序,那么您可以毫无问题地急剧增加。如果您使用的是Linux,则仅运行标准守护程序并从1 Gb左右的位置安装RAM,然后我会毫不犹豫地为JVM的堆使用75%的内存。同样,请记住,这是RAM 可用的75%,而不是RAM 已安装的75%。剩下的是可能正在主机上运行的其他用户登陆进程以及JVM需要的其他类型的内存(例如,用于堆栈)。总体而言,这通常很适合剩余的25%。显然,如果安装了更多的RAM,那么75%的赌注将会越来越安全。 (我希望JDK的人们已经实现了一个可以指定梯子的选项)

设置MaxRAMPercentage选项如下:

java -XX:MaxRAMPercentage=75.0  ....

请注意,这些百分比值是'double'类型的,因此您必须用小数点指定它们。如果使用“ 75”而不是“ 75.0”,则会出现一些奇怪的错误。

答案 9 :(得分:1)

XmsXmx是Java虚拟机(JVM)的标志:

  • Xmsinitial and minimum JVM heap size
    • Format-Xmx<size>[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大小的内存
  • Xmxmaximum JVM heap size
    • Format-Xmx<size>[g|G|m|M|k|K]
    • Default Size
      • <= R27.2
        • Windows:总共75%的物理内存最多1GB
        • Linux/Solaris50%的可用物理内存最多为1GB
      • >= R27.3
        • Windows X64:总共75%的物理内存最多2GB
        • Linux/Solaris X6450%的可用物理内存最多为2GB
        • Windows x86:总共75%的物理内存最多1GB
        • Linux/Solaris X8650%的可用物理内存最多为1GB
    • Typical Size
      • -Xmx1g
      • -Xmx2084M
      • -Xmx4g
      • -Xmx6g
      • -Xmx8g
    • Function / Effect
      • -> JVM允许使用最大Xmx大小的内存
        • 超过Xmx时,java.lang.OutOfMemoryError
          • 如何修复OutOfMemoryError
            • 超出了Xmx的值
              • 例如:从-Xmx4g-Xmx8g

更多细节

请参阅官方文档:-X Command-line Options