垃圾分代回收算法(Generational Collecting)

跟踪垃圾收集器,如复制、标记-清除和标记-整理等垃圾收集器,都是从根集(root set)开始扫描,遍历对象间的引用,直到访问了所有活的对象。

基于对对象生命周期分析后得出的垃圾回收算法: 把对象分为年青代、年老代、持久代,对不同生命周期的对象使用不同的算法进行回收。在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记-清理”或“标记-整理”算法来进行回收。现在的垃圾回收器(从J2SE1.2开始)都是使用此算法的。

QQ图片20130921145404

如上图所示,为Java堆中的各代分布。

1. Young(年轻代)JVM specification中的 Heap的一部份

年轻代分三个区。一个Eden区,两个Survivor区。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当这个Survivor区也满了的时候,从第一个Survivor区复制过来的并且此时还存活的对象,将被复制年老区(Tenured);。需要注意,Survivor的两个区是对称的,没先后关系,所以同一个区中可能同时存在从Eden复制过来对象,和从前一个Survivor复制过来的对象,而复制到年老区的只有从第一个Survivor区过来的对象。而且,Survivor区总有一个是空的。

2. Tenured(年老代)JVM specification中的 Heap的一部份

年老代存放从年轻代存活的对象。一般来说年老代存放的都是生命期较长的对象。

3. Perm(持久代) JVM specification中的 Method area

用于存放静态文件,如今Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。
持久代大小通过-XX:MaxPermSize=进行设置。

除了默认情况下使用的复制收集器和标记-整理收集器,JDK 1.4.1 还包含其他四种垃圾收集算法,每一种适用于不同的目的。JDK 1.4.1 包含一个增量收集器(自 JDK 1.2 就已经出现了)和三种在多处理器系统中进行更有效收集的新收集器――并行复制收集器、并行清除(scavenging)收集器和并发标记-清除收集器。这些新收集器是为了解决在多处理器系统中垃圾收集器成为伸缩性瓶颈这一问题的。图 2 显示了在什么时候选择备用收集选项的指导。

参考链接:http://www.ibm.com/developerworks/cn/java/j-jtp11253/

标签: none

添加新评论