-Xmxn
选项,则会使用默认值。根据Java文档,“默认值是根据系统配置在运行时选择的”。哪些系统配置设置影响默认值?-Xmxn
选项,则会使用默认值。根据Java文档,“默认值是根据系统配置在运行时选择的”。哪些系统配置设置影响默认值?在Windows上,您可以使用以下命令查找应用程序运行的系统默认设置。
java -XX:+PrintFlagsFinal -version | findstr HeapSize
查找 MaxHeapSize
(对应于 -Xmx
)和 InitialHeapSize
(对应于 -Xms
)选项。
在 Unix/Linux 系统中,你可以执行:
java -XX:+PrintFlagsFinal -version | grep HeapSize
我相信最终的输出是以字节为单位的。
InitialHeapSize = 262803264
和MaxHeapSize = 4206886912
,如果我没有弄错的话,这大约是256 MB和4 GB。这是否意味着每个JVM都会像使用-Xms256m -Xmx4g
选项一样启动? - Yuriy Nakonechnyyjava -XX:+PrintFlagsFinal -version | findstr /R /C:"HeapSize"
。 - sp00m-version
命令会抑制 stderr
上的长“使用”文本。 - Franklin Yu对于Java SE 5:根据垃圾回收器人体工程学 [Oracle]:
初始堆大小:
机器物理内存的1/64或一些合理的最小值中较大的那个。在J2SE 5.0之前, 默认的初始堆大小是一个合理的最小值,这个值因平台而异。您可以使用-Xms命令行选项覆盖此默认值。
最大堆大小:
物理内存的1/4或1GB中较小的那个。在J2SE 5.0之前, 默认的最大堆大小为64MB。您可以使用-Xmx命令行选项覆盖此默认值。
更新:
正如Tom Anderson在他的评论中指出的那样,上述内容适用于服务器级别的机器。来自JavaTM虚拟机5.0中的人体工程学:
在J2SE平台的5.0版本中,定义了一类称为服务器级别机器的机器,该机器具备以下特点:Java 8会占用超过您物理内存的 1/64 作为您的 Xmssize(最小堆大小),并且不到物理内存的 1/4 作为您的 -Xmxsize(最大堆大小)。
您可以通过以下方式检查默认的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 的物理内存(现在相当普遍),服务器虚拟机的内存总是等于物理内存的四分之一。
终于!
自 Java 8u191 版本起,你现在可以选择:
-XX:InitialRAMPercentage
-XX:MaxRAMPercentage
-XX:MinRAMPercentage
可以用来将堆大小设置为可使用物理 RAM 的百分比。(与安装的 RAM 减去内核使用的 RAM 相同)。
有关更多信息,请参见 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”,则会收到一些奇怪的错误提示。
MinRAMPercentage
参数与其名称不同,允许设置JVM运行时的最大堆大小内存较少(小于约250MB),而MaxRAMPercentage
允许设置JVM运行时的最大堆大小内存较多(大于约250MB)。因此,默认值取决于RAM的数量。另一个值将被忽略。您可以使用docker run --rm openjdk:8 java -XX:+PrintFlagsFinal -version | grep -E "RAMPercentage"
获取默认值。在我的笔记本电脑上,MaxRAMPercentage = 25.0
,MinRAMPercentage = 50%
。 - Davide MadrisanXms
和Xmx
是Java虚拟机(JVM)的标志:
Xms
:堆内存初始大小
格式
:-Xms<size>[g|G|m|M|k|K]
默认大小
:
-server
模式:空闲物理内存的25%,>=8MB且<=64MB-client
模式:空闲物理内存的25%,>=8MB且<=16MB典型大小
:
-Xms128M
-Xms256M
-Xms512M
功能
/效果
:
Xms
大小的内存Xmx
:JVM堆内存最大值
格式
:-Xmx<size>[g|G|m|M|k|K]
默认大小
:
<= 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
通常大小
:
-Xmx1g
-Xmx2084M
-Xmx4g
-Xmx6g
-Xmx8g
功能
/效果
:
Xmx
大小的内存
Xmx
时,会出现 java.lang.OutOfMemoryError
OutOfMemoryError
?
Xmx
值
-Xmx4g
增至 -Xmx8g
请查看官方文档:-X 命令行选项
Ernesto正确。根据他发布的链接[1]:
已更新客户端JVM堆配置
在客户端JVM中...
默认最大堆大小为物理内存的一半,最多可达192兆字节的物理内存大小,否则为物理内存的四分之一,最多可达1吉字节的物理内存大小。
例如,如果您的机器有128兆字节的物理内存,则最大堆大小为64兆字节;如果大于等于1吉字节的物理内存,则最大堆大小为256兆字节。
JVM实际上不会使用最大堆大小,除非程序创建了足够多的对象需要它。在JVM初始化期间,分配了一个更小的初始堆大小。...
- ...
- 现在服务器JVM堆配置符合客户端JVM堆配置,只是32位JVM的默认最大堆大小为1吉字节,对应于4吉字节的物理内存大小;而64位JVM的默认最大堆大小为32吉字节,对应于128吉字节的物理内存大小。
[1]http://www.oracle.com/technetwork/java/javase/6u18-142093.html
对于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
很抱歉!未找到内容
。 - nikodaemus根据系统配置,在运行时选择默认值。
请查看文档page
默认堆大小
除非在命令行上指定了初始和最大堆大小,否则它们将基于计算机上的内存量进行计算。
客户端JVM默认初始和最大堆大小:
默认最大堆大小为物理内存的一半(最大192兆字节),否则为物理内存的四分之一(最大1吉字节)。
服务器JVM默认初始和最大堆大小:
在32位JVM上,如果有4GB或更多物理内存,则默认最大堆大小可以高达1GB。在64位JVM上,如果有128GB或更多物理内存,则默认最大堆大小可以高达32GB。
哪些系统配置设置会影响默认值?
您可以使用标志-Xms(初始堆大小)和-Xmx(最大堆大小)指定初始和最大堆大小。如果您知道应用程序需要多少堆才能正常工作,您可以将-Xms和-Xmx设置为相同的值。
-Xmx
选项指定保留空间的大小。如果 -Xms
参数的值小于 -Xmx
参数的值,则并非立即将保留的所有空间都提交给虚拟机。此图中未提交的空间标记为“虚拟”。堆的不同部分(永久代、老年代和新生代)可以根据需要增长到虚拟空间的极限。
默认情况下,虚拟机在每次垃圾回收时增加或缩小堆以尝试保持空闲空间与活动对象之间的比例在特定范围内。此目标范围由参数 -XX:MinHeapFreeRatio=<minimum> 和 -XX:MaxHeapFreeRatio=<maximum> 以百分比设置,并且总大小在下限为 -Xms<min>,上限为 -Xmx<max>。这些参数将使得如果某一代的可用空间百分比低于40%,则该代会被扩展以维持40%的可用空间,直到达到该代允许的最大大小。同样地,如果可用空间超过70%,则该代将被压缩,以便只有70%的空间是可用的,但必须满足该代的最小大小。
大型服务器应用程序通常遇到这些默认值的两个问题。一个问题是启动速度慢,因为初始堆大小很小,需要在多次 major collections 中重新调整大小。更紧迫的问题是,对于大多数服务器应用程序来说,默认的最大堆大小太小了。服务器应用程序的经验法则是:
通常情况下,随着处理器数量的增加,增加内存,因为分配可以并行化。
这里有完整文章