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


419

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

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

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


1
系统配置意味着:a)客户端jvm与服务器jvm b)32位与64位。链接:1)从J2SE5.0更新docs.oracle.com/javase/6/docs/technotes/guides/vm/…2 )简要答案:docs.oracle.com/javase/8/docs/technotes/guides/vm / gctuning /… 3)详细的答案:docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/…4 )客户端与服务器:javacodegeeks.com/2011/07/jvm-options-client- vs-server.html
Vyshnav Ramesh Thrissur,

2
从以上链接很难理解。因此,在这里进行总结:Client jvm的最大堆大小为256mb(有一个例外,请参见上面的链接)。Server jvm 32位的最大堆大小为1gb,64位服务器的最大堆大小为32gb(同样,这里也有例外。请从链接中读取)。因此其256mb或1gb或32gb
Vyshnav Ramesh Thrissur

Answers:


505

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

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

寻找的选项MaxHeapSize(对-Xmx),并InitialHeapSize-Xms

在Unix / Linux系统上,您可以

java -XX:+ PrintFlagsFinal -version | grep HeapSize

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


3
我原本希望有这样一个不错的选择,但是使用IBM的Java 6 VM却对我不起作用。
马特·拉文

大!我可以使用所有这些默认选项吗?每个变量对应的ENV变量是多少?
Elist

28
就我而言,在Linux上,如果我没记错的话InitialHeapSize = 262803264MaxHeapSize = 4206886912它约为256 MB4 GB。这是否意味着每个JVM就像启动时都带有-Xms256m -Xmx4g选项一样启动?
Yuriy Nakonechnyy 2014年

9
在Windows系统上:java -XX:+PrintFlagsFinal -version | findstr /R /C:"HeapSize"
sp00m 2015年

1
在我的Linux上,@ matanster -version禁止显示上较长的“用法”文本stderr
富兰克林·于

115

对于Java SE 5:根据垃圾收集器的人机工程学[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

4
警告:这是针对服务器级计算机的,而不是针对客户端级的。您需要与java.sun.com/docs/hotspot/gc5.0/ergo5.html一起阅读该文档,后者定义了这些术语以及客户端类计算机所发生的情况。Dogbane,我可以谦虚地建议您编辑答案以引用相关文章吗?
汤姆·安德森

3
这在2012年的默认值低得离谱,可笑。几乎没有什么严重的应用程序可以容纳64兆字节。
Mark E. Haase 2012年

1
见埃内斯托的10月30日,Java的2012年后的答案客户机6更新18
安迪·托马斯

还请记住,它说:“堆大小的界限和分数对于J2SE 5.0是正确的。随着计算机功能的增强,它们在后续发行版中可能会有所不同。”
Lodovik

顺便说一下,该算法仅适用于并行垃圾收集器。
迈克·阿格里乌

45

爪哇8需要超过1/64的物理内存为您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'

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

机器的物理内存和Java版本。


5
是1/64而不是1/6吗?
Vyshnav Ramesh Thrissur,

1
是的Xmssize(最小HeapSize / InitialHeapSize)大于物理内存的1/64,而Xmxsize(最大HeapSize / MaxHeapSize)小于物理内存的1/4。(对于我的Mac,具有16GB内存的Forex,我得到uintx InitialHeapSize:= 268435456 {product} uintx MaxHeapSize:= 4294967296 {product},即Xms为268 MB&Xmx为4.29 GB
sjethvani

1
请编辑答案。它是1/64,而不是1/6。
emeraldhieu

35

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

假设我们有超过1 GB的物理内存(如今非常普遍),那么它始终是服务器虚拟机物理内存的1/4。


8
链接页面说不正确greater than or equal to 1 gigabyte of physical memory results in a maximum heap size of 256 megabytes
Paolo Fulgoni 2014年

5
我刚刚检查了具有5gb物理内存的linux机器。默认最大堆显示为1.5gb
ernesto 2015年

1
@PaoloFulgoni不,我现在观察到的另一个实际示例:129 GB的物理内存导致32 GB的最大堆大小
Kirill

有关正确的原因,请参阅apl的答案:stackoverflow.com/a/13310792/32453另请参见stackoverflow.com/a/56036202/32453
rogerdpack

16

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

更新了客户端JVM堆配置

在客户端JVM中...

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

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

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

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

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



8

最后!

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

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

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

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

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

我自己的规则:如果您的主机或多或少专用于运行给定的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”,则会出现一些奇怪的错误。


7

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

看看文档页面

默认堆大小

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

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

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

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

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

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

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


5

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

  • Xmsinitial and minimumJVMheap 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大小的内存开始
  • XmxmaximumJVMheap size
    • Format-Xmx<size>[g|G|m|M|k|K]
    • Default Size
      • <= R27.2
        • Windows75%总物理内存,最多1GB
        • Linux/Solaris:最大50%可用物理内存1GB
      • >= R27.3
        • Windows X6475%总物理内存,最多2GB
        • Linux/Solaris X64:最大50%可用物理内存2GB
        • Windows x8675%总物理内存,最多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命令行选项


这不是JRockit JVM的吗?(与Oracle的Hotspot JVM相反)
peterh

4

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

在此处输入图片说明

默认情况下,虚拟机会增大或缩小每个集合中的堆,以尝试将每个集合中活动对象的可用空间比例保持在特定范围内。此目标范围由参数- 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设置为相同的值可以通过从虚拟机中删除最重要的大小确定决策来提高可预测性。但是,如果选择不当,虚拟机将无法补偿。
  • 通常,由于分配可以并行化,因此随着处理器数量的增加而增加内存。

    全文

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.