首页 > 代码库 > JVM垃圾收集算法

JVM垃圾收集算法

JVM垃圾收集算法有引用计数、标记-清除(mark-sweep)(主要用于老年代),复制(copying)(主要用于新生代),标记-整理(mark-compact)(主要用于老年代),分代收集算法,我们分别介绍

1、引用计数:

原理:此对象有一个引用,则+1;删除一个引用,则-1。只用收集计数为0的对象
缺点:无法处理循环引用的问题。如:对象A和B分别有字段b、a,令A.b=B和B.a=A,除此之外这2个对象再无任何引用,那实际上这2个对象已经不可能再被访问,但是引用计数算法却无法回收他们

2、标记-清除:

标记—清除算法包括两个阶段:“标记”和“清除”,第一阶段:从根节点开始遍历所有被引用的对象,进行标记。第二阶段:对整个堆进行遍历,把未标记的对象进行清除。这个解决了循环引用的问题(清除阶段紧随标记阶段)

 缺点:

  暂停整个应用

  会产生内存碎片,当程序需要分配大内存对象时,可能无法找到足够的连续空间

3、复制:

此算法把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中。此算法每次只处理正在使用中的对象,因此复制成本比较小,同时复制过去以后还能进行相应的内存整理,不会出现“碎片”问题

缺点:

  每次只能使用内存的一半,造成内存的利用率不高

4、标记-整理:

 此算法结合了“标记-清除”和“复制”两个算法的优点。也是分两阶段,第一阶段从根节点开始标记所有被引用对象,第二阶段遍历整个堆,清除未标记对象,并且把存活对象“压缩”到堆的其中一块,按顺序排放。此算法避免了“标记-清除”的碎片问题,同时也避免了“复制”算法的空间问题

5、分带:

Jdk1.2以后使用此算法,基于对象生命周期分析得出的垃圾回收算法。把对象分为年轻代、年老代、持久代,对不同的生命周期使用不同的算法

注:

根节点是通过一些“GC Roots”对象作为起点,从这些节点开始往下搜索,搜索通过的路径称为引用链(Reference Chain),当一个对象没有被GC Roots的引用链连接的时候,则证明此对象是不可用的,不可达对象

GC Roots对象包括:

虚拟机栈(栈帧中的本地变量表)中的引用的对象

方法区域中的类静态属性引用的对象

方法区域中常量引用的对象

本地方法栈中JNI(Native方法)的引用的对象

 

JVM垃圾收集算法