龙空技术网

垃圾收集器你不知道的点

程序员小迷 60

前言:

眼前姐妹们对“垃圾收集器”大致比较关切,朋友们都想要了解一些“垃圾收集器”的相关文章。那么小编在网上收集了一些有关“垃圾收集器””的相关文章,希望朋友们能喜欢,朋友们一起来学习一下吧!

一、Serial

1.新生代,复制算法 ,单线程,简单高效,适合内存不大的情况。

2.在进行垃圾回收时,必须停止其他所有工作线程,直到垃圾回收结束。

二、ParNew

1.新生代,复制算法, 并行的多线程收集器。

2.ParNew垃圾收集器是Serial收集器的多线程版本,搭配CMS垃圾回收器的首选 。

三、Parallel Scavenge

1.新生代,复制算法 ,并行的多线程收集器 ,吞吐量优先收集器 。

2.类似ParNew,更加关注吞吐量,达到一个可控制的吞吐量。 3.本身是Server级别多CPU机器上的默认GC方式,主要适合后台运算不需要太多交互的任务。

四、Serial Old

Serial收集器的老年代版本,标记整理算法 , 单线程 ,Client模式下虚拟机使用。

五、Parallel Old

1.老年代,标记整理算法 ,并行的多线程收集器 。

2.Parallel Scavenge收集器的老年代版本,为了配合Parallel Scavenge的面向吞吐量的特性而开发的对应组合,在注重吞吐量以及CPU资源敏感的场合采用 。

3.Parallel Scavenge(Parallel GC)/Parallel Old

1)关注吞吐量的垃圾收集器,高吞吐量可以高效率地利用CPU时间,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的任务。

2)所谓吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值,即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)。例如:虚拟机总共运行了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%。

六、CMS

1.全称Concurrent Mark Sweep。老年代,标记清除算法 ,并行与并发收集器。尽可能的缩短垃圾收集时用户线程停止时间。

2.CMS收集器是一种以获取最短回收停顿时间为目标的收集器。目前很大一部分的Java应用集中在互联网网站或者B/S系统的服务端上,这类应用尤其重视服务的响应速度,希望系统停顿时间最短,以给用户带来较好的体验。CMS收集器就非常符合这类应用的需求。互联网后端目前CMS是主流的垃圾回收器。

3.从名字(包含"Mark Sweep")上就可以看出,CMS收集器是基于"标记—清除"算法实现的,它的运作过程相对于前面几种收集器来说更复杂一些,整个过程分为4个步骤,包括:

1)初始标记-短暂,仅仅只是标记一下GC Roots能直接关联到的对象,速度很快。

2)并发标记-和用户的应用程序同时进行,进行GC Roots Tracing的过程。

3)重新标记-短暂,为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段稍长一些,但远比并发标记的时间短。

4)并发清除。

由于整个过程中耗时最长的并发标记和并发清除过程收集器线程都可以与用户线程一起工作,所以,从总体上来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。

4.使用-XX:+UseConcMarkSweepGC 标记时,表示新生代使用ParNew,老年代使用CMS。

5.浮动垃圾:由于CMS并发清理阶段用户线程还在运行着,伴随程序运行自然就还会有新的垃圾不断产生,这一部分垃圾出现在标记过程之后,CMS无法在当次收集中处理掉它们,只好留待下一次GC时再清理掉。这一部分垃圾就称为"浮动垃圾"。

6.缺点在于:

1)会产生内存碎片 。

2)需要更多cpu资源 。

3)浮动垃圾问题,需要更大的堆空间 。

七、G1

1.全称Garbage First。跨新生代和老年代。标记整理 + 化整为零 ,并行与并发收集器 。适用于具有大内存容量和多核心处理器的机器。

2.在JDK1.7正式引入,采用分区回收的思维,将堆内存划分为多个大小相等的区域,优先回收价值最大的区域,基本不牺牲吞吐量的前提下完成低停顿的内存回收。可预测的停顿是其最大的优势。面向服务端应用的垃圾回收器,目标为取代CMS 。

八、ZGC

1.全称Z Garbage Collector。在JDK11引入。多线程环境,适用需要低延迟和大量内存(可达TB级别)的应用。

2.一种可扩展的低延迟垃圾收集器,使用彩色指针(几乎可以达到停顿时间不超过10毫秒的目标)和负载屏障来实现并发标记-整理算法。

九、引申

1.并行收集器:垃圾收集的多线程的同时进行,此时用户线程处于等待状态。

2.并发收集器:垃圾收集的多线程和应用的多线程同时进行。

3.吞吐量=运行用户代码时间/(运行用户代码时间+ 垃圾收集时间)

垃圾收集时间= 垃圾回收频率 * 单次垃圾回收时间

微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是程序员小迷(致力于C、C++、Java、Kotlin、Android、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

欢迎关注。助您在编程路上越走越好!

标签: #垃圾收集器