先说结论:在jdk1.6,Hotspot中,方法区大小是不包括进java堆的大小中的。
《深入理解Java虚拟机第二版 周志明著》第41页提及到:“方法区与Java堆一样,是各个线程共享的内存区域。它用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。虽然java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做非堆,目的应该是与Java堆区分开来的。”
jvm配置参数如下:
-Xmx16m -Xms16m -Xmn5m -XX:PermSize=16m
-XX:+PrintGCDetails
java测试代码如下:
public static void main(String[] args) {
System.out.println(Runtime.getRuntime().totalMemory() / 1000000);
System.out.println(Runtime.getRuntime().freeMemory() / 1000000);
System.out.println(Runtime.getRuntime().maxMemory() / 1000000);
控制台输出如下:
所以说百度搜索第一位http://unixboy.iteye.com/blog/174173/ 中整个JVM内存大小=年轻代大小 + 年老代大小 + 持久代大小
是错的,至少在hotspot1.6中不成立,整个JVM内存大小=Xmx=年轻代大小 + 年老代大小。持久代要另外算。