Java SE 6的Sun JVM的默认最大堆大小是多less?
Java SE 6的Sun JVM的默认最大堆大小(即相当于设置-Xmx)是多less?
看起来像使用服务器级机器的Java SE 5, 就是这样
较小的物理内存的四分之一或1GB。
奖金问题:看起来像IBM的JVM,你可以问它
java -verbose:sizes -version
你同样可以问Sun的JVM吗?
编辑 :
我使用了Runtime.getRuntime()。maxMemory来确认min(物理内存/ 4,1G),在Sun文档中引用。
java 1.6.0_21或更高版本,或者…
$ java -XX:+PrintFlagsFinal -version 2>&1 | grep MaxHeapSize uintx MaxHeapSize := 12660904960 {product}
它看起来最小(1G)已被删除。
或者在Windows上使用findstr
C:\>java -XX:+PrintFlagsFinal -version 2>&1 | findstr MaxHeapSize
有人可以问一些Java代码:
long maxBytes = Runtime.getRuntime().maxMemory(); System.out.println("Max memory: " + maxBytes / 1024 / 1024 + "M");
见javadoc 。
使用JDK,您还可以使用jinfo连接到所讨论的<PROCESS_ID>
的JVM,并获取MaxHeapSize的值:
jinfo -flag MaxHeapSize <PROCESS_ID>
从JDK6U18开始,以下是堆大小的configuration。
在客户端JVM中,默认的Java堆configuration已被修改,以改善当今富客户端应用程序的性能。 初始堆和最大堆大小更大,并且与分代垃圾收集相关的设置可以更好地调整。
默认的最大堆大小是物理内存的一半,直到物理内存大小为192 MB,否则为物理内存的四分之一直到1 GB的物理内存大小。 例如,如果您的计算机具有128兆字节的物理内存,则最大堆大小为64兆字节,而大于或等于1千兆字节的物理内存会导致最大堆大小为256兆字节。 除非您的程序创build了足够的对象来请求JVM,否则最大的堆大小实际上不会被JVM使用。 在JVM初始化过程中分配的数量小得多,称为初始堆大小。 这个数量至less是8兆字节,否则物理内存的1/64直到物理内存大小为1千兆字节。
资料来源: http : //www.oracle.com/technetwork/java/javase/6u18-142093.html
一种方法是如果你有一个jdk的安装,在bin文件夹中有一个实用工具叫做jconsole(甚至可以使用visualvm)。 启动它,并连接到相关的Java进程,你可以看到什么是堆大小设置设置和许多其他细节
当只运行headless或cli时,如果在启动相关服务时指定一个端口连接,jConsole可以通过局域网使用。
要回答这个问题,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的物理内存; 如果机器有<= 1Gb,则为内存的1/4; 最大256Mb。 在我testing一个带有2Gb物理内存的32位WindowsXP系统时,Java分配了256Mb,这与文档一致。
Sun / Oracle jre6u18 doc说re服务器:与客户端相同,然后添加混淆语言:对于32位JVM,默认最大为1Gb,对于64位JVM,默认为32Gb。 在我testing一台具有8Gb物理的64位Linux机器上,Java分配2Gb,这是物理的1/4; 在一台配有128Gb物理Java的64位Linux机器上分配32Gb,也是物理的1/4。
感谢这个SO贴子引导我:
服务器级机器的定义最近改变了吗?