本教程操作环境:windows7系统、java10版,DELL G3电脑。
1.标记-清除算法
sun前期版本就是用这个技术。
第一阶段:从引用根节点开始标记所有被引用的对象,
第二阶段:遍历整个堆,把未标记的对象清除。此算法需要暂停整个应用,并且会产生内存碎片。
2.复制算法
该算法将内存平均分成两部分,然后每次只使用其中的一部分,当这部分内存满的时候,将内存中所有存活的对象复制到另一个内存中,然后将之前的内存清空,只使用这部分内存,循环下去。
注意:
这个算法与标记-整理算法的区别在于,该算法不是在同一个区域复制,而是将所有存活的对象复制到另一个区域内。
优点:
实现简单;不产生内存碎片
缺点:
每次运行,总有一半内存是空的,导致可使用的内存空间只有原来的一半。
3.标记整理算法
标记-整理算法结合了“标记-清除”和“复制”两个算法的优点。也是分两阶段,
第一阶段从根节点开始标记所有被引用对象,
第二阶段遍历整个堆,清除未标记对象并且把存活对象“压缩”到堆的其中一块,按顺序排放。此算法避免了“标记-清除”的碎片问题,同时也避免了“复制”算法的空间问题。
4.引用计数
此对象有一个引用,则+1;删除一个引用,则-1。只用收集计数为0的对象。
缺点:无法处理循环引用的问题。如: 对象A和B分别有字段b、a,令A.b=B和B.a=A,除此之外这2个对象再无任何引用,那实际上这2个对象已经不可能再被访问,但是引用计数算法却无法回收他们。
5.分代
J2SE1.2以后使用此算法
基于对象生命周期分析得出的垃圾回收算法。把对象分为年轻代、年老代、持久代,对不同的生命周期使用不同的算法(2-3方法中的一个即4自适应)进行回收。
以上就是java中gc算法的基本介绍,对于上面的六种方法,我们需要牢固掌握的是前三种,后面两种引用和分代可以做一个了解。关于更多GC算法的使用,大家可以在课后查阅资料。



