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