来自Java SE 6的Sun JVM的默认最大堆大小是多少(即相当于设置-Xmx)?
使用服务器级机器it's
看起来像Java SE 5小于1/4的物理内存或1GB。
奖金问题:对于IBM的JVM,您可以ask it
java -verbose:sizes -version
你能同样问Sun的JVM吗?
修改:
我使用Runtime.getRuntime()。maxMemory来确认Sun documentation中引用的min(物理内存/ 4,1G)。
答案 0 :(得分:111)
java 1.6.0_21或更高版本,或者......
$ java -XX:+PrintFlagsFinal -version 2>&1 | grep MaxHeapSize
uintx MaxHeapSize := 12660904960 {product}
看起来min(1G)已被移除。
或者在Windows上使用findstr
C:\>java -XX:+PrintFlagsFinal -version 2>&1 | findstr MaxHeapSize
答案 1 :(得分:15)
可以问一些Java代码:
long maxBytes = Runtime.getRuntime().maxMemory();
System.out.println("Max memory: " + maxBytes / 1024 / 1024 + "M");
请参阅javadoc。
答案 2 :(得分:14)
使用JDK,
您还可以使用jinfo连接到有问题的<PROCESS_ID>
的JVM,并获取MaxHeapSize的值:
jinfo -flag MaxHeapSize <PROCESS_ID>
答案 3 :(得分:8)
从JDK6U18开始,以下是堆大小的配置。
在Client JVM中,默认的Java堆配置已经完成 修改以改善当今富客户端的性能 应用。初始和最大堆大小更大和设置 与世代垃圾收集相关的问题得到了更好的调整。
默认的最大堆大小是物理内存的一半,物理内存大小为192兆字节,否则为四分之一 物理内存最大为1千兆字节的物理内存。 例如,如果您的计算机具有128兆字节的物理内存,则最大堆大小为64兆字节,并且大于或等于 到1千兆字节的物理内存导致最大堆大小为256 兆字节。 除非程序创建足够的对象来要求它,否则JVM实际上不会使用最大堆大小。数量少得多, 称为初始堆大小,在JVM初始化期间分配。 此数量至少为8兆字节,否则为物理的1/64 内存最大为1千兆字节的物理内存。
来源:http://www.oracle.com/technetwork/java/javase/6u18-142093.html
答案 4 :(得分:5)
一种方法是如果你安装了jdk,在bin文件夹中有一个名为jconsole的实用程序(甚至可以使用visualvm)。 启动它并连接到相关的java进程,您可以看到堆大小设置集和许多其他详细信息
当仅运行headless或cli时,如果在启动相关服务时指定了要连接的端口,则jConsole可以在lan上使用。
答案 5 :(得分:3)
要回答这个问题,Java VM是处于CLIENT还是SERVER模式至关重要。 您可以指定“-client”或“-server”选项。否则java使用内部规则;基本上win32总是客户端,Linux总是服务器,但请看这里的表:
http://docs.oracle.com/javase/6/docs/technotes/guides/vm/server-class.html
Sun / Oracle jre6u18 doc说再客户端:如果机器有<= 192MB,VM会获得1/2的物理内存;如果机器有&lt; = 1Gb,则为内存的1/4;最大256Mb。在我对具有2Gb phys mem的32位WindowsXP系统的测试中,Java分配了256Mb,这与文档一致。
Sun / Oracle jre6u18 doc说re server:与客户端相同,然后添加令人困惑的语言:对于32位JVM,默认最大值为1Gb,对于64位JVM,默认值为32Gb。在我使用8Gb物理的64位Linux机器上测试时,Java分配2Gb,这是物理的1/4;在具有128Gb物理Java的64位Linux机器上,分配32Gb,同样是物理的1/4。感谢这篇SO帖子指导我: