按照基本回收策略分
引用计数(Reference Counting)
这个算法有很长的历史了,算是比较古老的了。该算法的原理是该对象都有一个引用,也就是说增加了一个计数,当删除一个引用就会减少一个计数。当回收垃圾时,只是收集计算等于0的对象。此算法无法处理循环引用的问题,这也是该算法最致命的缺陷。
标记-清除(Mark-Sweep)
该算法分成2个阶段执行。
第1阶段:从引用根节点开始标记所有被引用的对象;
第2阶段:对整个堆进行遍历,清除未标记的对象。
缺点:
需要暂停整个应用会产生内存碎片
复制(Copying)
该算法会把内存空间划分为两个相等的区域,每一次只会使用其中的一个区域。当回收垃圾时,会遍历当前所使用的区域,会把正在使用中的对象拷贝到另一个区域中去。每一个只会处理当前正在使用中的对象,所以复制所需的成本都是比较小的,复制过去后还会进行相应的内存整理,不会有“碎片”的问题出现。
缺点:需要两倍内存空间。
标记-整理(Mark-Compact)
该算法是“标记-清除”和“复制”两个算法的优点结合体。
该算法的执行也是分两阶段:
第1阶段:从根节点开始标记所有被引用对象;
第2阶段:对整个堆进行遍历,对未标记的对象进行清除,把存活对象“压缩”到堆中的其中一块,按照顺序排放。
优点:
避免了“标记-清除”的碎片问题避免了“复制”算法的空间问题
按分区对待的方式分
增量收集(Incremental Collecting)
该算法是实时的垃圾回收,也就是说程序在执行的同时也在进行垃圾的回收。
分代收集(Generational Collecting)
该算法对对象的生命周期深入分析后得出的。对不同生命周期的对象使用不同的算法进行回收。从J2SE1.2开始,JVM中就是使用该垃圾回收器算法。
按系统线程分
串行收集
在处理垃圾回收工作的时候使用的是单线程执行,为什么是单线程呢?因为这里不需要多线程交互,实现起来容易,而且效率也是比较高。但是也有比较明显的局限性,就是多处理器的优势无法使用,故该收集适合在单处理器机器上。该收集器也可以用在小数据量(100M左右)情况下的多处理器机器上。
并行收集
该垃圾回收器使用多线程进行处理,故速度很快,效率很高。在理论上来讲,CPU数目越多,就越是能体现出并行收集器的优势。
并发收集
相比于前2种,前2种在进行垃圾回收工作时,整个运行环境都会暂停,而这个时候只有垃圾回收程序在运行,所以系统在进行垃圾回收的时候会有很明显的暂停,而且堆越大暂停时间而只有垃圾回收程序在运行,因此,系统在垃圾回收时会有明显的暂停,而且堆越大暂停时间就会越长。