如果我从Java命令行中省略了-Xmxn
选项,那么将使用默认值。 根据Java文档
“根据系统配置在运行时选择默认值”
哪些系统配置设置会影响默认值?
Java 6更新18中对此进行了更改。
假设我们拥有超过1 GB的物理内存(如今非常普遍),则它始终是您物理内存的1/4。
埃内斯托是对的。 根据他发布的链接[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
在Windows上,可以使用以下命令查找运行应用程序的系统上的默认设置。
java -XX:+ PrintFlagsFinal -version | findstr堆大小
查找选项MaxHeapSize
(对于-Xmx
)和InitialHeapSize
对于-Xms
。
在Unix / Linux系统上,您可以
java -XX:+ PrintFlagsFinal -version | grep HeapSize
我相信结果输出以字节为单位。
对于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
在运行时根据系统配置选择默认值
看看文档页面
默认堆大小
除非在命令行上指定了初始堆大小和最大堆大小,否则它们将根据计算机上的内存量进行计算。
客户端JVM默认的初始和最大堆大小:
默认的最大堆大小是物理内存的一半,最大物理内存大小为192兆字节(MB) ,否则为物理内存的四分之一,最大物理内存大小为1 GB 。
服务器JVM默认的初始和最大堆大小:
在32位JVM上, 如果有4 GB或更多的物理内存 , 则默认的最大堆大小最大为1 GB 。 在64位JVM上,如果有128 GB或更多的物理内存,则默认的最大堆大小最大为32 GB。
哪些系统配置设置会影响默认值?
您可以使用标志-Xms (初始堆大小)和-Xmx (最大堆大小)来指定初始堆大小和最大堆大小。 如果您知道应用程序需要多少堆才能正常工作,则可以将-Xms和-Xmx设置为相同的值
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版本。
根据垃圾收集器的人机工程学[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
许多参数会影响世代大小。 下图说明了堆中已提交空间和虚拟空间之间的区别。 在虚拟机初始化时,将保留堆的整个空间。 可以使用-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%的空间是可用的,这取决于代的最小大小。
大型服务器应用程序在使用这些默认值时通常会遇到两个问题。 一种是缓慢的启动,因为初始堆很小,并且必须在许多主要集合中调整其大小。 更为紧迫的问题是,对于大多数服务器应用程序,默认的最大堆大小过小。 服务器应用程序的经验法则是:
通常,由于分配可以并行化,因此随着处理器数量的增加而增加内存。
有全文
Xms
和Xmx
是Java虚拟机(JVM)的标志:
Xms
: initial 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
:
Xms
大小的内存 Xmx
: maximum
JVM heap size
Format
: -Xmx[g|G|m|M|k|K]
Default Size
:
<= R27.2
Windows
:占总物理内存的75%
,最大为1GB
Linux/Solaris
: 50%
的可用物理内存高达1GB
>= R27.3
Windows X64
:高达2GB
的总物理内存的75%
Linux/Solaris X64
: 50%
的可用物理内存高达2GB
Windows x86
:高达1GB
的总物理内存的75%
Linux/Solaris X86
: 50%
的可用物理内存高达1GB
Typical Size
:
-Xmx1g
-Xmx2084M
-Xmx4g
-Xmx6g
-Xmx8g
Function
/ Effect
:
Xmx
大小的最大内存
Xmx
,将java.lang.OutOfMemoryError
OutOfMemoryError
?
Xmx
值
-Xmx4g
到-Xmx8g
请参阅官方文档: -X命令行选项
最后!
从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”,则会出现一些奇怪的错误。