java堆的大小包括加上方法区(持久代)的大小吗

先说结论:在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);


控制台输出如下:

java堆的大小包括加上方法区(持久代)的大小吗_第1张图片

所以说百度搜索第一位http://unixboy.iteye.com/blog/174173/ 整个JVM内存大小=年轻代大小 + 年老代大小 + 持久代大小

是错的,至少在hotspot1.6中不成立,整个JVM内存大小=Xmx=年轻代大小 + 年老代大小。持久代要另外算。


你可能感兴趣的:(JVM)