直接入正题吧!
相信了解过JVM的人都听说过,在JVM中的一个非堆内存在java8之前叫做永久代,在java8后,就更名为元空间了,当然这两个概念都是基于HotSpot虚拟机,其他虚拟机没有这些概念
为了理清这些变化,先说一下方法区和永久代的区别
方法区只是一规范,在不同的虚拟机中的实现是不一样的,例如永久代和元空间。
用于存放被已经被JVM加载的的类信息,常量,静态变量,方法数据,构造函数和普通方法等
java堆物理上有新生代和老年代,逻辑上分为新生代+老年代+永久代
解析:
永久代其实只是方法区的一个存储实现,逻辑上划分为堆的一部分,为的是方法区也可以用堆内存的GC垃圾回收机制,而不用重新针对方法区做GC操作,直接使用堆内存的GC就可以了
在java8后,使用元空间替代了永久代,且元空间的内存不在JVM堆中,而是在本地内存中,所以java8元空间,基本不存在OOM内存溢出;
但是java7的永久代位于JVM内存中,存在OOM错误;
且在java8中,常量池是位于元空间中,string的实例化放在堆内存中