①:Serial(串行)收集器
最基本,历史最悠久的串行收集器,单线程阻塞队列,jdk1.5之前默认的收集器。
优点:简单高效,没有线程交互的开销。
缺点:单线程,只会使用一个cpu/一条收集线程去完成垃圾收集。
对应算法:年轻代复制算法,老年代标记整理算法。
②:ParNew收集器(Serial收集器的多线程版本)
多CPU时对系统资源利用率很好,默认开启的收集线程数与CPU相同,单CPU时Serial有更好的效果。
③:Paraller Scavenge 收集器
特点:并行,目标是达到一个可控制的吞吐量(运行用户代码时间/(运行用户代码时间+垃圾手机时间)),自适应调节策略。
优点:适合需要与用户交互的程序,响应速度良好。
缺点:无法与CMS收集器配合使用。
④:CMS收集器
优点:并发,低停顿。
缺点:对CPU资源敏感,面向并发设计的程序都对CPU资源敏感,因为占用了一部分线程(CPU资源)导致程序变慢,吞吐量降低,无法处理浮动垃圾,标记-清除算法导致内存碎片。
⑤:G1收集器
特点:采用一种与众不同的方式组织堆内存,堆内存划分为多个大小相等的内存块,每个内存块是逻辑连续的一段内存,大小是2的N次方。
G1提供了三种垃圾回收模式:Young GC,Mixed GC和Full GC,在不同条件下触发。
Young GC 发生在年轻代的GC算法,一般对象(除了巨型对象)都在Eden Region 中分配内存,当被内存耗尽时,就会触发Young GC。
Mixed GC 当对象晋升到老年代时,为了避免堆内存耗尽,虚拟机就会触发混合的垃圾收集器Mixed GC,会回收整个Young Region,还回收一部分Old Region。
Full GC 如果对象内存分配速度过快,Mixed GC来不及回收,导致老年代占满,就会触发Full GC,就是单线程执行的serial old gc,会导致异常长时间的暂停时间,需要进行不断地调优,尽可能避免Full GC。