方法区
方法区是一个规范。
存储的运行时的常量池,类加载后的类信息、final定义的常量、静态变量及即时编译器编译后的数据信息等等。
永久代
永久代(PermGen)是方法区的一个实现(相当于接口于实现类的关系),我们通常说的是HotSpot虚拟机,也就是说,它用来存放运行时的常量池,类加载后的元数据、final定义的常量、静态变量及即时编译器编译后的数据信息等等。
jdk1.6及以前,存在,并且字符串常量池StringPool也在方法区就是永久代中。
jdk1.7已经逐步移去,字符串常量池StringPool移到了堆中。
jdk1.8彻底移去,替换成了元空间,字符串常量池StringPool移到了元空间中。
元空间
元空间(metaspace)是方法区的一个实现,是一块直接内存,已经不属于JVM了,由系统决定大小,当然也可调。
jdk1.8,字符串常量池StringPool移到了元空间,StringPool维护的是字符串的引用,不是实例(在HotSpot虚拟机找那个,实现stringpool的是StringTable类,是一个哈希表来记录引用),实例在堆中开辟了一块空间,专门储存。
jdk1.8之后,元空间替换了永久代,如下图所示。
总结
- 方法区是sun公司虚拟机定义的规范。
- 永久代是方法区的一个实现。
- 元空间是方法区的一个实现,是永久代的一种替换。
- jdk1.6及以前stringpool在方法区中,jdk1.7在堆中,jdk1.8在元空间中。jdk1.8元空间维护的是一个StringTable哈希类,stringpool记录的是引用,实例还是在堆中。