1.JDK1.7的堆内存模型

Yong年轻代
Yong区划分为三个部分,Eden区和两个大小严格相同的survivor区,其中,Survivor区间中,某一时刻只有其中一个是被使用的,另外一个留做垃圾收集时复制对象用,在Eden区间变满的时候,GC就会将存活的对象移到空闲的survivor区间中,根据JVM的策略,在经过几次垃圾收集后,任然存活于survivor的对象将被移动到Tenured区间;
Tenured老年代
Tenured区主要保存生命周期长的对象,一般是一些老的对象,当一些对象在Yong复制移动一定的次数以后,对象就会被转移到Tenured区,一般如果系统中用了application级别的缓存,缓存中的对象往往会被转移到这一区间;
Perm永久区
Perm主要保存class,method,field对象,这部分的空间一般不会溢出,除非一次性加载了很多的类,不过在涉及到热部署的应用服务器的时候,有时候会遇到java.lang.OutOfMeemoryError:PermGen space的错误,造成这个错误的很大原因就有可能是每次都重新部署,但是重新部署后,类的class没有被卸载掉,这样就造成了大量的class对象保存在Perm中,这种情况下,一般重新启动应用服务器可以解决问题;
2.JDK1.8的堆内存模型

JDK1.8的内存模型是由2部分组成,年轻代+年老代
年轻代:Eden+2*survivor
年老代:OldGen
JDK1.8中变化最大的Perm区,用Metaspace(元数据空间)进行替换了;
注意:Metaspace所占用的内存空间不是在虚拟机内部,而是在本地内存空间中,这也是1.7永久代最大的区别所在;

3.为什么要废弃1.7中的永久代
原文:https://www.cnblogs.com/wnwn/p/12401832.html