JVM的堆内存模型1.7和1.8对比

JVM的堆内存模型

jvm的堆内存模型在1.7和1.8有较大的区别,下面将对两个版本堆内存模型进行讲解

1. jdk1.7的堆内存模型

jdk1.7堆内存分为三块,新生代,老年代以及永久代
在这里插入图片描述

  1. 新生代(young):新生成的对象优先存放到新生代中,新生代对象存活率很低,常规应用一次垃圾收集一般可以回收70%~95%的空间。 新生代内存区域被分为三部分,Eden区 和两个Suvivor区(To和Form),默认比例为8:1:1。两个Suvivor区只有From区是被使用的,另一个留做垃圾回收时复制对象使用。在Eden区满时,会把依然存活的对象移入空闲的Suvivor区,根据JVm的策略,经过多次垃圾回收还存活在Suvivor区的将被移入到老年代(Tenured/Old)中。注意:一个大的对象很有可能会被直接分配到老年代中。
  2. 老年代(Tenured/Old):在新生代中经历了多次(具体看虚拟机配置的阀值)GC后仍然存活下来的对象会进入老年代中。一般如果系统中用了 application级别的缓存,缓存中的对象往往会被转移到这一区间。
  3. 永久代(Perm):永久代存储类信息、常量、静态变量、即时编译器编译后的代码等数据,对这一区域而言,Java虚拟机规范指出可以不进行垃圾收集,一般而言不会进行垃圾回收。其中新生代和老年代组成了Java堆的全部内存区域,而永久代不属于堆空间,它在JDK 1.8以前被Sun HotSpot虚拟机用作方法区的实现。
  4. Virtual区: 最大内存和初始内存的差值,就是Virtual区。

jdk1.8 的内存模型

jdk1.8 的内存由两块组成,新生代和老年代
新生代:Eden + Suvivor *2
老年代:Old Generation
在jdk 1.8中变化最大的Perm区,永久区用MetaSpace(元数据空间)进行了替换。
注意:MetaSpace 占用的空间不是在虚拟机内部,而是在本地内存空间中,这是和1.7永久代最大的区别

为什么要废弃Jdk1.7中的永久代?

官网给出了解释:http://openjdk.java.net/jeps/122

This is part of the JRockit and Hotspot convergence effort. JRockit
customers do not need to configure the permanent generation (since JRockit
does not have a permanent generation) and are accustomed to not
configuring the permanent generation.
移除永久代是为融合HotSpot JVM与 JRockit VM而做出的努力,因为JRockit没有永久代,
不需要配置永久代。

1. JDK 1.8以前的永久代(PermGen)

Java虚拟机规范对方法区的限制非常宽松,除了和Java堆一样不需要连续的内存和可以选择固定大小或者可扩展外,还可以选择不实现垃圾收集,也就是说,Java虚拟机规范只是规定了方法区的概念和它的作用,并没有规定如何去实现它。

对于JDK 1.8之前的版本,HotSpot虚拟机设计团队选择把GC分代收集扩展至方法区,即用永久代来实现方法区,这样HotSpot的垃圾收集器可以像管理Java堆一样管理这部分内存,能够省去专门为方法区编写内存管理代码的工作。对于其他的虚拟机(如Oracle JRockit、IBM J9等)来说是不存在永久代的概念的。

如果运行时有大量的类产生,可能会导致方法区被填满,直至溢出。常见的应用场景如:Spring和ORM框架使用CGLib操纵字节码对类进行增强,增强的类越多,就需要越大的方法区来保证动态生成的Class可以加载入内存。大量JSP或动态产生JSP文件的应用(JSP第一次运行时需要编译为Java类)。基于OSGi的应用(即使是同一个类文件,被不同的类加载器加载也会视为不同的类)。 ……

这些都会导致方法区溢出,报出java.lang.OutOfMemoryError: PermGen space。

2. JDK 1.8的元空间(Metaspace)

在JDK 1.8中,HotSpot虚拟机设计团队为了促进HotSpot与 JRockit的融合,修改了方法区的实现,移除了永久代,选择使用本地化的内存空间(而不是JVM的内存空间)存放类的元数据,这个空间叫做元空间(Metaspace)。

做了这个改动以后,java.lang.OutOfMemoryError: PermGen的空间问题将不复存在,并且不再需要调整和监控这个内存空间,且虚拟机需要为方法区设计额外的GC策略:如果类元数据的空间占用达到参数“MaxMetaspaceSize”设置的值,将会触发对死亡对象和类加载器的垃圾回收。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值