Java 1.5有默认的-Xmx设置吗?

15

仅出于兴趣 - 默认值是否存在,或在每个操作系统上都不同?

如果存在默认值,那么这些默认值是什么?非常难以找到!


我猜是64m,但我不能确定。 - JavaRocky
3个回答

21

正如Matt Solnit所回答的,Java 1.5的具体规定是对于服务器级别的机器,堆大小为1GB或物理内存的1/4,以较小值为准,其他机器为64MB(来自Java 5.0 Ergonomics documentation)。

不幸的是,JVM随着时间的推移而改变,最合适的文档越来越难以确定,因此要找出特定JVM的默认堆(和PermGen堆)大小,最好的方法是让JVM告诉你。


在"1.6.0_06"和"1.6.0_21"之间,添加了-XX:+PrintFlagsFinal选项,似乎是在"1.6.0_23"左右引起了人们的注意。它提供了有关JVM配置的丰富信息,但我们将集中讨论堆和permgen大小和限制。

Linux

在Linux上,您可以使用以下命令:

java -XX:+PrintFlagsFinal -version 2>&1 | grep -i -E 'heapsize|permsize|version'

Windows

同样地,在Windows上,你可以使用以下命令:

java -XX:+PrintFlagsFinal -version 2>&1 | findstr /I "heapsize permsize version"

注意事项

  • 根据您的系统,java可能默认为-client-server,因此,如果您强制应用程序使用其中任何一个启动,则在启动这些命令时也可以执行相同的操作。

示例

在我的Linux系统上,我得到:

$ java -XX:+PrintFlagsFinal -version 2>&1 | grep -i -E 'heapsize|permsize|version'
uintx AdaptivePermSizeWeight               = 20               {product}
uintx ErgoHeapSizeLimit                    = 0                {product}
uintx InitialHeapSize                     := 66328448         {product}
uintx LargePageHeapSizeThreshold           = 134217728        {product}
uintx MaxHeapSize                         := 1063256064       {product}
uintx MaxPermSize                          = 67108864         {pd product}
uintx PermSize                             = 16777216         {pd product}
java version "1.6.0_24"

默认情况下,它会使用 -server,因此使用 -client,我会得到:

$ java -client -XX:+PrintFlagsFinal -version 2>&1 | grep -i -E 'heapsize|permsize|version'
uintx AdaptivePermSizeWeight               = 20               {product}
uintx ErgoHeapSizeLimit                    = 0                {product}
uintx InitialHeapSize                     := 16777216         {product}
uintx LargePageHeapSizeThreshold           = 134217728        {product}
uintx MaxHeapSize                         := 268435456        {product}
uintx MaxPermSize                          = 67108864         {pd product}
uintx PermSize                             = 12582912         {pd product}
java version "1.6.0_24"

在我的Windows系统上,我得到:
C:\>java -XX:+PrintFlagsFinal -version 2>&1 | findstr /I "heapsize permsize version"
uintx AdaptivePermSizeWeight               = 20               {product}
uintx ErgoHeapSizeLimit                    = 0                {product}
uintx InitialHeapSize                     := 16777216         {product}
uintx LargePageHeapSizeThreshold           = 134217728        {product}
uintx MaxHeapSize                         := 268435456        {product}
uintx MaxPermSize                          = 67108864         {pd product}
uintx PermSize                             = 12582912         {pd product}
java version "1.6.0_21"

这些是关于客户端的设置,但似乎没有服务器选项:-client

C:\>java -server -XX:+PrintFlagsFinal -version 2>&1 | findstr /I "heapsize permsize version"
C:\>java -server -XX:+PrintFlagsFinal -version
Error: no `server' JVM at `C:\jdk\jre\bin\server\jvm.dll'.

总结一下:
Parameter \ JVM             1.6.0_24                   
                            Lin/svr  Lin/cli  Windows  
InitialHeapSize               63MB     16MB     16MB   
LargePageHeapSizeThreshold   128MB    128MB    128MB   
MaxHeapSize                 1014MB    256MB    256MB   
MaxPermSize                   64MB     64MB     64MB   
PermSize                      16MB     12MB     12MB   

3
需要特定的虚拟机版本吗?在1.6.06上我收到了“未识别选项”错误。 - yurez

17

您可以在Java 5.0 动态适应性文档中找到详细信息。具体而言:

  • 对于“服务器级”机器(2个或以上处理器,2GB内存以上),默认的最大堆大小为物理内存的四分之一,最高不超过1G字节
  • 对于“普通”机器,默认的最大堆大小为64 MB。

1
Windows机器不会自动应用“服务器”标志。大概是因为假设Windows机器通常运行客户端应用程序。我非常确定您必须明确设置所需的内存大小。否则,默认值为64MB。 - Fortyrunner
2
根据链接文档,32位的Windows机器不会自动获得“服务器”标志,但64位的机器会。不过,值得注意。谢谢 :-). - Matt Solnit
这个链接 (ergo) 现在似乎已经失效。重定向到 http://www.oracle.com/technetwork/java/index.html。 - GreenGiant
@GreenGiant 感谢提醒。我已修复链接。 - Matt Solnit

9
根据Java文档,Sun/Oracle的WindowsSolaris/Linux JVM的默认值为64MB。但是不同的JVM供应商可能有所不同。例如,JRockit的默认-Xmx值为总内存的75%或1GB中较小的一个。
如果您想知道JVM可以使用的最大内存量,请在运行时调用:
System.out.println(Runtime.getRuntime().maxMemory());

嗨krock。不幸的是,版本1.5中“java”的“man”页面是错误的。实际默认值在我回答中链接的“人体工程学”文章中描述。在Java 6.0中,“man”页面已经修正为简单地说:“默认值是根据系统配置在运行时选择的。有关更多信息,请参见HotSpot人体工程学。” - Matt Solnit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接