Answers:
在Windows上,可以使用以下命令查找运行应用程序的系统上的默认设置。
java -XX:+ PrintFlagsFinal -version | findstr堆大小
寻找的选项MaxHeapSize
(对-Xmx
),并InitialHeapSize
为-Xms
。
在Unix / Linux系统上,您可以
java -XX:+ PrintFlagsFinal -version | grep HeapSize
我相信结果输出以字节为单位。
InitialHeapSize = 262803264
,MaxHeapSize = 4206886912
它约为256 MB和4 GB。这是否意味着每个JVM就像启动时都带有-Xms256m -Xmx4g
选项一样启动?
java -XX:+PrintFlagsFinal -version | findstr /R /C:"HeapSize"
-version
禁止显示上较长的“用法”文本stderr
。
对于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
爪哇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版本。
Java 6更新18中对此进行了更改。
假设我们有超过1 GB的物理内存(如今非常普遍),那么它始终是服务器虚拟机物理内存的1/4。
greater than or equal to 1 gigabyte of physical memory results in a maximum heap size of 256 megabytes
埃内斯托是对的。根据他发布的链接[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
最后!
从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”,则会出现一些奇怪的错误。
在运行时根据系统配置选择默认值
看看文档页面
默认堆大小
除非在命令行上指定了初始堆大小和最大堆大小,否则它们将根据计算机上的内存量进行计算。
客户端JVM默认的初始和最大堆大小:
默认的最大堆大小是物理内存的一半,最大物理内存大小为192兆字节(MB),否则为物理内存的四分之一,最大物理内存大小为1 GB。
服务器JVM默认初始和最大堆大小:
在32位JVM上,如果有4 GB或更多的物理内存,则默认的最大堆大小最大为1 GB。在64位JVM上,如果有128 GB或更多的物理内存,则默认的最大堆大小最大为32 GB。
哪些系统配置设置会影响默认值?
您可以使用标志-Xms(初始堆大小)和-Xmx(最大堆大小)来指定初始堆大小和最大堆大小。如果您知道应用程序需要多少堆才能正常工作,则可以将-Xms和-Xmx设置为相同的值
Java虚拟机(JVM)的Xms
和Xmx
是标志:
Xms
:initial and minimum
JVMheap size
Format
: -Xmx<size>[g|G|m|M|k|K]
Default Size
:
-server
模式:25%的可用物理内存,> = 8MB和<= 64MB-client mode
:25%的可用物理内存,> = 8MB和<= 16MBTypical Size
:
-Xms128M
-Xms256M
-Xms512M
Function
/ Effect
:
Xms
大小的内存开始Xmx
:maximum
JVMheap 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命令行选项
许多参数会影响世代大小。下图说明了堆中已提交空间和虚拟空间之间的区别。在虚拟机初始化时,将保留堆的整个空间。可以使用该-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%的空间是可用的,这取决于代的最小大小。
大型服务器应用程序在使用这些默认值时通常会遇到两个问题。一种是缓慢的启动,因为初始堆很小,并且必须在许多主要集合中调整其大小。更为紧迫的问题是,对于大多数服务器应用程序,默认的最大堆大小过小。服务器应用程序的经验法则是:
通常,由于分配可以并行化,因此随着处理器数量的增加而增加内存。
有全文