JDK堆内存模型

1  jdk1.7堆内存模型

JDK堆内存模型_第1张图片

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堆内存模型
JDK堆内存模型_第2张图片
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 基于此,将永久区废弃,而改用元空间,改为了使用本地内存空间。
 
     
 
 
 
 
 

 

 

你可能感兴趣的:(理论,jvm)