如果我从Java命令行中省略-Xmxn
选项,则将使用默认值。根据{{3}}
“在运行时根据系统配置选择默认值”
哪些系统配置设置会影响默认值?
答案 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
默认堆大小
除非在命令行中指定了初始和最大堆大小,否则它们将根据计算机上的内存量进行计算。
客户端JVM默认初始和最大堆大小:
默认的最大堆大小是物理内存的一半,直到物理内存大小为192兆字节(MB),否则物理内存的四分之一,直到物理内存大小1千兆字节(GB)。
服务器JVM默认初始和最大堆大小:
在32位JVM上,如果有4 GB或更多物理内存,则默认最大堆大小最多可为1 GB。 在64位JVM上,如果有128 GB或更多物理内存,则默认最大堆大小最多为32 GB
哪些系统配置设置会影响默认值?
您可以使用标记 -Xms (初始堆大小)和 -Xmx <指定初始和最大堆大小/ strong>(最大堆大小)。如果您知道应用程序需要多少堆才能正常工作,可以将 -Xms 和 -Xmx 设置为相同的值
答案 7 :(得分: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%的空间可用,这取决于代的最小大小。
大型服务器应用程序在使用这些默认值时通常会遇到两个问题。一种是缓慢的启动,因为初始堆很小,并且必须在许多主要集合中调整其大小。更为紧迫的问题是,对于大多数服务器应用程序,默认的最大堆大小过小。服务器应用程序的经验法则是:
通常,随着内存数量的增加而增加内存 处理器,因为分配可以并行化。
答案 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)
Xms
和Xmx
是Java虚拟机(JVM)的标志:
Xms
:initial 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
:
Xms
大小的内存Xmx
:maximum
JVM 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
:
Xmx
大小的内存
Xmx
时,java.lang.OutOfMemoryError
OutOfMemoryError
?
Xmx
的值
-Xmx4g
到-Xmx8g
请参阅官方文档:-X Command-line Options