1 jdk1.7堆内存模型
1.1 Young
年轻区(代)
Young
区被划分为三部分,
Eden
区和两个大小严格相同的
Survivor
区,其中,
Survivor
区间中,某一时刻只有
其中一个是被使用的,另外一个留做垃圾收集时复制对象用,在
Eden
区间变满的时候,
GC
就会将存活的对
象移到空闲的
Survivor
区间中,根据
JVM
的策略,在经过几次垃圾收集后,任然存活于
Survivor
的对象将被移
动到
Tenured
区间。
1.2 Tenured
年老区
Tenured
区主要保存生命周期长的对象,一般是一些老的对象,当一些对象在
Young
复制转移一定的次数以
后,对象就会被转移到
Tenured
区,一般如果系统中用了
application
级别的缓存,缓存中的对象往往会被转
移到这一区间。
1.3 Perm
永久区
Perm
代主要保存
class,method,fifiled
对象,这部份的空间一般不会溢出,除非一次性加载了很多的类,不过在
涉及到热部署的应用服务器的时候,有时候会遇到
java.lang.OutOfMemoryError : PermGen space
的错误,
造成这个错误的很大原因就有可能是每次都重新部署,但是重新部署后,类的
class
没有被卸载掉,这样就造
成了大量的
class
对象保存在了
perm
中,这种情况下,一般重新启动应用服务器可以解决问题。
2 jdk1.8堆内存模型
2.1 jdk1.8 年轻代和老年代几乎一样,jdk 1.8中只有年轻代和年老代组成 ,注意的是1.8中变化最大的perm区用matespace进行了替换,jdk1.8中matespace占用的是本地内存空间,而不是虚拟机的内存空间
2.2 为什么要废弃永久代
《1》 移除永久代是为融合
HotSpot JVM
与
JRockit VM
而做出的努力,因为
JRockit
没有永久代,不需要配置永久代。
《2》
由于永久代内存经常不够用或发生内存泄露,爆出异常
java.lang.OutOfMemoryError: PermGen
。
基于此,将永久区废弃,而改用元空间,改为了使用本地内存空间。