分代回收机制

原创 2016年05月31日 15:29:23
  • 分代收集算法是目前大部分JVM的垃圾收集器采用的算法。它的核心思想是根据对象存活的生命周期将内存划分为若干个不同的区域。一般情况下将堆区划分为老年代(Tenured Generation)和新生代(Young Generation),老年代的特点是每次垃圾收集时只有少量对象需要被回收,而新生代的特点是每次垃圾回收时都有大量的对象需要被回收,那么就可以根据不同代的特点采取最适合的收集算法。
  • 目前大部分垃圾收集器对于新生代都采取Copying算法,因为新生代中每次垃圾回收都要回收大部分对象,也就是说需要复制的操作次数较少,但是实际中并不是按照1:1的比例来划分新生代的空间的,一般来说是将新生代划分为一块较大的Eden空间和两块较小的Survivor空间(大小8:1),每次使用Eden空间和其中的一块Survivor空间,当进行回收时,将Eden和Survivor中还存活的对象复制到另一块Survivor空间中,然后清理掉Eden和刚才使用过的Survivor空间。
  • 所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。年轻代分三个区。一个Eden区,两个 Survivor区(一般而言)。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个 Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当这个Survivor去也满了的时候,从第一个Survivor区复制过来的并且此时还存活的对象,将被复制“年老区(Tenured)”。需要注意,Survivor的两个区是对称的,没先后关系,所以同一个区中可能同时存在从Eden复制过来对象,和从前一个Survivor复制过来的对象,而复制到年老区的只有从第一个Survivor去过来的对象。而且,Survivor区总有一个是空的。同时,根据程序需要,Survivor区是可以配置为多个的(多于两个),这样可以增加对象在年轻代中的存在时间,减少被放到年老代的可能。
  • 新生代使用复制算法,当Minor GC时如果存活对象过多,无法完全放入Survivor区,就会向老年代借用内存存放对象,以完成Minor GC。在触发Minor GC时,虚拟机会先检测之前GC时租借的老年代内存的平均大小是否大于老年代的剩余内存,如果大于,则将Minor GC变为一次Major GC,如果小于,则查看虚拟机是否允许担保失败,如果允许担保失败,则只执行一次Minor GC,否则也要将Minor GC变为一次Major GC。说白了,新生代放不下就会借用老年代的空间来进行GC。
    当对象在新生代躲过一次Minor GC的话,其对象年龄便会加1,默认情况下,如果对象年龄达到15岁,就会移动到老年代中;一般来说,大对象会被直接分配到老年代,所谓的大对象是指需要大量连续存储空间的对象,最常见的一种大对象就是大数组或者长字符串。
  • 而由于老年代的特点是每次回收都只回收少量对象,一般使用的是Mark-Compact算法。注意,在堆区之外还有一个代就是永久代(Permanet Generation或者说新的metaspace),它用来存储class类、常量、方法描述等。对永久代的回收主要回收两部分内容:废弃常量和无用的类。
  • 严格说,full gc 不等于 minor GC + major GC,这三者是三个不同的概念
    minor gc在新生代
    major gc在老生代,有时也伴随着至少一次minor gc
    full gc在整个heap上(甚至包括永生代,或者说新的metaspace)有时也被定义和major gc一样

相关文章推荐

垃圾回收算法之分代回收算法

当前商业虚拟机基本上都是采用分代垃圾回收算法来回收垃圾,思想也很简单,就是根据对象的生命周期将内存划分,然后进行分区管理。在Java虚拟机分代垃圾回收机制中,应用程序可用的堆空间可以分为年轻代与老年代...

JAVA分代垃圾回收机制测试

java分代回收测试 测试代码: package juint.test; import java.util.HashMap; import java.util.Map; public cla...

JAVA分代垃圾回收机制

虚拟机中的共划分为三个代:年轻代(Young Generation)、年老代(Old Generation)和持久代(Permanent Generation)。其中持久代主要存放的是Java类的类信...

Java垃圾回收算法以及分代回收机制

java垃圾回收算法实现原理,有两种,一个是引用计数法,一个是引用可达法。 引用计数法,每个对象有一个专门的空间维护一个引用计数器,当该对象被引用时,计数器加一,引用消失时则计数器减一,当该对象引用...

GC垃圾回收机制

  • 2014年12月19日 14:53
  • 181KB
  • 下载

java垃圾回收机制

  • 2016年06月19日 07:57
  • 14KB
  • 下载

JVM内存管理、JVM垃圾回收机制、新生代、老年代以及永久代

你对JVM内存组成结构和JVM垃圾回收机制是否熟悉,这里和大家简单分享一下,希望对你的学习有所帮助,首先来看一下JVM内存结构,它是由堆、栈、本地方法栈、方法区等部分组成,结构图如下所示。 JV...

sun_GC回收机制及内存等优化

  • 2016年12月06日 19:53
  • 1.03MB
  • 下载

Java垃圾回收机制详解

  • 2011年11月19日 14:33
  • 199KB
  • 下载

.NET垃圾回收机制-代(generation)的原理分析

.NET的垃圾回收器是用一种叫代的原理,假设以下三种情况成立,则提出了代的概念。 越是新的对象,他的生存周期就越短越是老得对象,它的生存周期就越长回收一部分堆对象比回收全部堆对象性能高 第一步...
  • kntao
  • kntao
  • 2011年12月20日 17:10
  • 1753
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:分代回收机制
举报原因:
原因补充:

(最多只允许输入30个字)