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

如果我从Java命令行中省略了-Xmxn选项,那么将使用默认值。 根据Java文档

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

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


#1楼

Java 6更新18中对此进行了更改。

假设我们拥有超过1 GB的物理内存(如今非常普遍),则它始终是您物理内存的1/4。


#2楼

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

更新了客户端JVM堆配置

在客户端JVM中...

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

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

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

  • ...
  • 服务器JVM堆配置的人机工程学与客户端相同,不同之处在于32位JVM的默认最大堆大小为1 GB ,对应于4 GB的物理内存大小,而64位JVM 的默认最大堆大小为32 GB ,对应于到128 GB的物理内存大小。

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


#3楼

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

java -XX:+ PrintFlagsFinal -version | findstr堆大小

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

在Unix / Linux系统上,您可以

java -XX:+ PrintFlagsFinal -version | grep HeapSize

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


#4楼

对于IBM JVM,命令如下:

java -verbose:sizes -version

有关IBM Java SDK 8的更多信息, 请访问 : http : //www-01.ibm.com/support/knowledgecenter/SSYKE2_8.0.0/com.ibm.java.lnx.80.doc/diag/appendixes/defaults.html ?lang = en


#5楼

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

看看文档页面

默认堆大小

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

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

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

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

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

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

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


#6楼

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

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

Windows中

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

Linux中

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

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

您的物理内存和Java版本。


#7楼

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

初始堆大小:

计算机上物理内存的1/64的较大值或合理的最小值。 在J2SE 5.0之前,默认的初始堆大小是一个合理的最小值,随平台的不同而不同。 您可以使用-Xms命令行选项覆盖此缺省值。

最大堆大小:

小于物理内存的1/4或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版中,进行了以下选择

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

#8楼

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

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

参数默认值

MinHeapFreeRatio 40

MaxHeapFreeRatio 70

-Xms 3670k

-Xmx 64m

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

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

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

  • 除非您在暂停方面遇到问题,否则请尝试为虚拟机分配尽可能多的内存。 默认大小(64MB)通常太小。
  • 将-Xms和-Xmx设置为相同的值可以通过从虚拟机中删除最重要的大小确定决策来提高可预测性。 但是,如果选择不当,虚拟机将无法补偿。
  • 通常,由于分配可以并行化,因此随着处理器数量的增加而增加内存。

    有全文


#9楼

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

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

更多详情

请参阅官方文档: -X命令行选项


#10楼

最后!

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

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

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

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

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

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

设置MaxRAMPercentage选项如下所示:

java -XX:MaxRAMPercentage=75.0  ....

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

你可能感兴趣的:(如何确定默认的Java堆大小?)