Java垃圾回收器:

1.回收器相当于java中的一个小程序,类似于其他程序中的一个线程。

2.serial收集器,也叫串行垃圾回收器,主要工作在新生代中,使用复制算法。串行收集器每次工作时会占用cpu一个核,并且其他的线程都会停止执行,导致STW。

3.serialold回收器,工作在老年代的垃圾回收器,使用标记整理算法,同样是到单线程的。

4paralley scavenge收集器主要是多线程的一个过程,他主要关注程序执行的吞吐量,例如推荐算法中对吞吐量的要求更高!

5paralley old收集器工作在看年代使用标记整理算法

6paralley new收集器,这个收集器相当于串行收集器的多线程版本,其他相似

7.并发垃圾回收器,cms回收器,它的工作原理如下,它使用三色标记算法,即黑白灰标记对象,他与其他的收集器不同,他会两次标记,首先使用根可达初始标记,并且在用户线程执行的过程中会掺杂着标记,当需要清理的时候使用重新标记,将一些对象标记完成。由于之前的标记做足了准备,所以stw时间会变短。这也是互联网公司和jdk8中常用的垃圾回收器,对响应时间要求较高。

8.G1收集器,它是将内存分成若干个小区,和之前垃圾回收器的不同的是,在这些小区上又分代,彼此相邻的两个小区可能是不同代的。这个过程实现起来很复杂,由于可能存在不同代内引用其他代中的对象。它还支持并发(回收器与其他程序交替执行)与并行(多个垃圾回收器多线程进行),由于g1分区之后,垃圾回收器可以在一分区内进行,所以垃圾回收器可能一次回收的时间很短。 jdk1.9以后逐步从cms收集器转向到g1回收器,并且由于g1只是采用了分代的概念,实际上,g1实在分区的基础上添加了一个分代的概念,逻辑上分代物理上已经不在分代了。

可以使用jvm参数的方式来添加或者选择垃圾回收器。

G1垃圾回收器的概念图:

alt