JVM--方法区、永久代、元空间、字符串常量池

方法区

方法区是一个规范

存储的运行时的常量池,类加载后的类信息、final定义的常量、静态变量及即时编译器编译后的数据信息等等。

 

永久代

永久代(PermGen)是方法区的一个实现(相当于接口于实现类的关系),我们通常说的是HotSpot虚拟机,也就是说,它用来存放运行时的常量池,类加载后的元数据、final定义的常量、静态变量及即时编译器编译后的数据信息等等。

jdk1.6及以前,存在,并且字符串常量池StringPool也在方法区就是永久代中。

jdk1.7已经逐步移去,字符串常量池StringPool移到了堆中。

jdk1.8彻底移去,替换成了元空间,字符串常量池StringPool移到了元空间中。

 

元空间

元空间(metaspace)是方法区的一个实现,是一块直接内存,已经不属于JVM了,由系统决定大小,当然也可调。

jdk1.8,字符串常量池StringPool移到了元空间,StringPool维护的是字符串的引用,不是实例(在HotSpot虚拟机找那个,实现stringpool的是StringTable类,是一个哈希表来记录引用),实例在堆中开辟了一块空间,专门储存。

jdk1.8之后,元空间替换了永久代,如下图所示。

JVM--方法区、永久代、元空间、字符串常量池_第1张图片

 

 

总结

  • 方法区是sun公司虚拟机定义的规范
  • 永久代是方法区的一个实现。
  • 元空间是方法区的一个实现,是永久代的一种替换。
  • jdk1.6及以前stringpool在方法区中,jdk1.7在堆中,jdk1.8在元空间中。jdk1.8元空间维护的是一个StringTable哈希类,stringpool记录的是引用,实例还是在堆中。

 

你可能感兴趣的:(JVM,永久代,元空间,常量池,方法区)