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

Ric*_*man 397 java heap heap-memory

如果我从Java命令行中省略-Xmxn选项,则使用默认值.根据Java文档 "默认值是在运行时根据系统配置选择的".

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

sto*_*333 483

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

java -XX:+ PrintFlagsFinal -version | findstr HeapSize

寻找选项MaxHeapSize(for -Xmx)和InitialHeapSizefor -Xms.

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

java -XX:+ PrintFlagsFinal -version | grep HeapSize

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

  • 在我的Linux案例中,`InitialHeapSize = 262803264`和`MaxHeapSize = 4206886912`,大约**256 MB**和**4 GB**如果我没有弄错的话.这是否意味着每个JVM的启动就像是使用`-Xms256m -Xmx4g`选项启动的一样? (26认同)
  • 在Windows系统上:`java -XX:+ PrintFlagsFinal -version | findstr/R/C:"HeapSize"` (8认同)
  • 我希望有一个像这样的好选项,但它对我使用IBM的Java 6 VM不起作用. (3认同)
  • 那么... 0 是什么意思?:) (2认同)
  • @matanster 在我的 Linux 上,`-version` 抑制了 `stderr` 上的长“使用”文本。 (2认同)

dog*_*ane 110

根据Garbage Collector Ergonomics [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

  • 警告:这是服务器级机器,而不是客户端类.您需要结合http://java.sun.com/docs/hotspot/gc5.0/ergo5.html阅读该文档,该文档定义了这些术语以及客户端类机器会发生什么.狗狗,我可能谦虚地建议你编辑你的答案引用相关的段落? (4认同)
  • 这是2012年的一个非常低的默认值.很少有严肃的应用程序适合64兆字节. (3认同)

ern*_*sto 32

Java 6更新18对此进行了更改.

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

  • 不正确,链接页面说"大于或等于1千兆字节的物理内存导致最大堆大小为256兆字节" (7认同)
  • 我刚刚检查了一台带有5GB物理内存的linux机器.默认最大堆显示为1.5gb (4认同)

Sar*_*dra 28

对于Xmssize(最小HeapSize),Java 8占用物理内存的1/6以上,而对于-Xmxsize(最大HeapSize),则占用物理内存的1/4不到1/4.

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

Windows中:

java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"
Run Code Online (Sandbox Code Playgroud)

Linux中:

java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
Run Code Online (Sandbox Code Playgroud)

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

您的物理内存和Java版本.

  • 是1/64而不是1/6吗? (2认同)

pet*_*erh 17

最后!

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

-XX:InitialRAMPercentage
-XX:MaxRAMPercentage
-XX:MinRAMPercentage
Run Code Online (Sandbox Code Playgroud)

可用于将堆大小确定为可用物理 RAM 的百分比。(这与安装的 RAM 少内核使用的内容相同)。

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

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

我自己的规则:如果您的主机或多或少致力于运行给定的 java 应用程序,那么您可以毫无问题地大幅增加。如果您在 Linux 上,只运行标准守护进程,并且已经安装了大约 1 Gb 及以上的 RAM,那么我会毫不犹豫地将 75% 用于 JVM 的堆。同样,请记住,这是可用RAM 的 75% ,而不是安装的 RAM。剩下的是可能在主机上运行的其他用户进程和 JVM 需要的其他类型的内存(例如用于堆栈)。总之,这通常很适合剩下的 25%。显然,安装更多 RAM 时,75% 是一个更安全的赌注。(我希望 JDK 人员实现了一个可以指定梯子的选项)

设置MaxRAMPercentage选项如下所示:

java -XX:MaxRAMPercentage=75.0  ....
Run Code Online (Sandbox Code Playgroud)

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


小智 15

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

更新了客户端JVM堆配置

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

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

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

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

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

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


cri*_*fan 14

XmsXmxJava虚拟机的标志(JVM):

  • Xms:initial and minimum虚拟机heap size
    • Format-Xms<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大小内存
  • Xmx:maximum虚拟机heap size
    • Format-Xmx<size>[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 命令行选项


Rav*_*abu 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设置为相同的值


the*_*dor 6

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

在此处输入图片说明

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

参数默认值

最小堆自由比率 40

MaxHeapFreeRatio 70

-Xms 3670k

-Xmx 64m

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

使用这些参数,如果一代中的可用空间百分比低于 40%,则该代将被扩展以保持 40% 的可用空间,直至该代的最大允许大小。同样,如果空闲空间超过 70%,则代将收缩,使得只有 70% 的空间是空闲的,受限于代的最小大小。

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

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

    全文