仅出于兴趣 - 默认值是否存在,或在每个操作系统上都不同?
如果存在默认值,那么这些默认值是什么?非常难以找到!
正如Matt Solnit所回答的,Java 1.5的具体规定是对于服务器级别的机器,堆大小为1GB或物理内存的1/4,以较小值为准,其他机器为64MB(来自Java 5.0 Ergonomics documentation)。
不幸的是,JVM随着时间的推移而改变,最合适的文档越来越难以确定,因此要找出特定JVM的默认堆(和PermGen堆)大小,最好的方法是让JVM告诉你。
-XX:+PrintFlagsFinal
选项,似乎是在"1.6.0_23"左右引起了人们的注意。它提供了有关JVM配置的丰富信息,但我们将集中讨论堆和permgen大小和限制。
在Linux上,您可以使用以下命令:
java -XX:+PrintFlagsFinal -version 2>&1 | grep -i -E 'heapsize|permsize|version'
同样地,在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"
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
您可以在Java 5.0 动态适应性文档中找到详细信息。具体而言:
System.out.println(Runtime.getRuntime().maxMemory());