- JDK8默认的是Parallel Old
- JDK9默认的是G1(Garbage First)
- JDK11默认的是ZGC
识别垃圾的算法:
- 引用计数法
- 可达性分析
1、Serial
新生代垃圾收集器,采用复制算法,单线程,同时STW(Stop The World);
2、ParNew
新生代垃圾收集器,采用复制算法,是Serial的多线程版本,STW;
3、Parallel Scavenge
新生代垃圾收集器,采用复制算法,并行多线程,同时具有GC自适应的调节策略(新生代的大小、Eden与Survivor区的比例、晋升老年代对象年龄等细节参数);
4、Serial Old
是Serial的老年代版本,单线程,采用标记-整理算法,它主要有两大用途:一种用途是在JDK 1.5以及之前的版本中与Parallel Scavenge收集器搭配使用,另一种用途就是作为CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure时使用。
5、Parallel Old
Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。可以考虑将Parallel Scavenge和Parallel Old配合使用。
6、CMS
初始标记--> 并发标记 --> 重新标记-->并发清除
是一款标记-清除算法,收集结束时会有空间碎片产生,由于在垃圾收集阶段用户线程还需要运行,还需预留有足够的内存空间给用户线程使用,因此CMS需要预留一部分空间提供并发收集时的程序运作使用。如果CMS运行期间预留的内存无法满足程序需要,就会出现一次“Concurrent Mode Failure”失败,这时虚拟机将启动后备预案:临时启用Serial Old收集器来重新进行老年代的垃圾收集。
如果剩余内存不足,则临时启动Serial Old,如果产生大量碎片,无法分配大块内存,则触发Full GC。
7、G1
初始标记--> 并发标记--> 最终标记--> 筛选清除
堆中的内存,是逻辑上的连续,物理上的不连续,可以自动调节新生代和老年代的比例,触发回收的阈值是基于整个堆大小。