【永久代】改叫【metaspace元空间】,将常量池存放在堆内存中,类信息存放在metaspace元空间
java8 之后将永久代中的常量池放到了堆内存中,永久代变成了metaspace(元区域)。
为什么使用元空间替代永久代
因为永久代来存储信息,常量,静态变量等数据不是好的主意,很容易遇到内存溢出的问题.
对永久代进行调优是很困难的,同时将元空间与堆的垃圾回收进行了隔离,避免永久代引发的Full GC 和OOM等问题.
方法区为什么会改名
jdk1.7叫永久代,jdk1.8叫元空间,虽然叫法是不同,但是还是有区别的.
以前的方法区的实现是跟随堆的.可能堆最先开辟一片空间,但是堆呢又会有它的所谓的内存分配和垃圾回收,所以,在jdk1.7以前,永久代的做法其实和堆是一样的,它使用了所谓的内存分配和垃圾回收机制是一样的.
但是这种机制会导致我们垃圾回收的时候不太方便,毕竟方法区里面放的东西和堆里面的对象是不一样的,所以在jdk1.8以后采取了去永久代,它另外再来开辟一片空间(元空间),元空间的内存分配和所谓的回收就跟堆里面就没有什么太多的关系了,元空间和堆的内存机制是不一样的了.
元空间和永久代最大的区别是在于分配的策略和垃圾回收的策略.