java虚拟机的各种垃圾收集器介绍(GC收集器没有最好的,通用的,只有在某些场景下更适合的)

GC收集器没有最好的,通用的,只有在某些场景下更适合的

下面来介绍各种垃圾收集器:

1.serial收集器

收集垃圾的时候,暂停所有工作线程,stop the world。

简单高效,对于运行在client模式下的虚拟机来说是一个很好的选择,完全可以将停顿控制在几十毫秒。

2.parnew收集器

serial收集器的多线程版本(多个CPU下工作更好)

它是许多运行在server模式下虚拟机中首选的新生代 收集器,目前除serial外,只有它能与CMS收集器(老年代)配合工作。

3.parallel scavenge收集器

他是一个新生代收集器,使用复制算法的收集器,又是多线程的收集器。

不同的时它的目标不是尽可能缩小挺短,它的目的是达到一个可以控制的吞吐量。(停顿时间短适合用户交互,吞吐量高适合快速完成任务,进行后台的运算)

可以通过 -XX:MaxGCPauseMillis 控制最大停顿时间,通过-XX:GCTimeRatia来控制吞吐量大小。

4.serial old收集器

serial的老年代版本,单线程的,使用标记整理算法。

存在的主要目的就是给client模式下的虚拟机配合serial收集器使用

5.parallel old收集器

parallel scavenge的老年代版本,采用标记整理算法。

使得吞吐量优先的收集器有了更好的应用组合。

6.CMS收集器

最大的目的就是最小化停顿时间。

过程是:初始标记,stop the world停止线程,进行标记,但只是标记与GC  Roots直接相连的。

              并发标记,不需要stop the world,与用户线程同时进行,进行引用链追踪的标记

              重新标记,由于并发标记与用户线程同时进行,用户可能修改一些引用,这时就需要对某些引用进行更正。也会stop t

 the world            

              并发清除

缺点是:较为占用CPU资源,无法处理浮动垃圾,浮动垃圾是在并发标记期间新产生的垃圾,但还未标记。另外,他还会产生大量的不连续的内存碎片。

发布了415 篇原创文章 · 获赞 434 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/qq_41901915/article/details/103546379