GC的几种垃圾收集器

Serial收集器

      串行收集器是最古老,最稳定以及效率高的收集器,可能会产生较长的停顿,只使用一个线程去回收。新生代、老年代使用串行回收;新生代复制算法、老年代标记-压缩;垃圾收集的过程中会Stop The World(服务暂停)

参数控制:-XX:+UseSerialGC  串行收集器

                                       

优点:是单线程的  也就是说它在运行的时候,所有的线程都得等着它

缺点:还是所有的线程都得等着它(会造成运行速度的变慢)   stop the world

 

ParNew收集器

ParNew收集器其实就是Serial收集器的多线程版本。新生代并行,老年代串行;新生代复制算法、老年代标记-压缩

参数控制:-XX:+UseParNewGC  ParNew收集器

                  -XX:ParallelGCThreads 限制线程数量 

                                

优点:使用的多线程。回收线程从一个变成了多个,把Serial的效率提高了

缺点在这个时候只能运行回收线程,所有的非回收线程都被禁用 stop the world

 

Parallel Scavenge收集器

Parallel Scavenge收集器类似ParNew收集器,Parallel收集器更关注系统的吞吐量。可以通过参数来打开自适应调节策略,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或最大的吞吐量;也可以通过参数控制GC的时间不大于多少毫秒或者比例;新生代复制算法、老年代标记-压缩

参数控制:-XX:+UseParallelGC  使用Parallel收集器+ 老年代串行

                                              

 

Parallel Old 收集器

Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。这个收集器是在JDK 1.6中才开始提供

参数控制: -XX:+UseParallelOldGC 使用Parallel收集器+ 老年代并行

 

CMS收集器

    使用标记-清除算法的垃圾回收器。

    由于并发的原因,他的垃圾回收停顿时间会比较小,但是相应的牺牲了吞吐量,停顿时间短的好处是能提高用户体验,所以,他被广泛地用于B/S架构中。

    CMS垃圾回收器回收垃圾一般分为四步:

    初始标记:快速标记GCROOT能够关联到的对象,这个步骤会STW;

    并发标记;

    重新标记:此过程会STW,为了修正并发标记时,用户线程对标记的变化;

    并发清理:清理过程是并发的;

                                       

 优点:并发收集、低停顿

 缺点:(1)会产生内存碎片(标记-清理带来的缺点)

            (2)牺牲了吞吐量,没有办法处理浮动的垃圾( 浮动垃圾主要来自于 并发清除阶段 )

 

G1收集器  

       G1是目前技术发展的最前沿成果之一,HotSpot开发团队赋予它的使命是未来可以替换掉JDK1.5中发布的CMS收集器。与CMS收集器相比G1收集器有以下特点:

       1. 空间整合,G1收集器采用标记整理算法,不会产生内存空间碎片。分配大对象时不会因为无法找到连续空间而提前触发下一次GC。

       2. 可预测停顿,这是G1的另一大优势,降低停顿时间是G1和CMS的共同关注点,但G1除了追求低停顿外,还能建立可预测的停顿时间模型,能让使用者明确指定在一个长度为N毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒,这几乎已经是实时Java(RTSJ)的垃圾收集器的特征了。

      上面提到的垃圾收集器,收集的范围都是整个新生代或者老年代,而G1不再是这样。使用G1收集器时,Java堆的内存布局与其他收集器有很大差别,它将整个Java堆划分为多个大小相等的独立区域(Region),虽然还保留有新生代和老年代的概念,但新生代和老年代不再是物理隔阂了,它们都是一部分(可以不连续)Region的集合。

                           

       G1的新生代收集跟ParNew类似,当新生代占用达到一定比例的时候,开始出发收集。和CMS类似,G1收集器收集老年代对象  会有短暂停顿。

 

收集步骤

1、标记阶段,首先初始标记(Initial-Mark),这个阶段是停顿的(Stop the World Event),并且会触发一次普通Mintor GC。对应GC log:GC pause (young) (inital-mark)

2、Root Region Scanning,程序运行过程中会回收survivor区(存活到老年代),这一过程必须在young GC之前完成。

3、Concurrent Marking,在整个堆中进行并发标记(和应用程序并发执行),此过程可能被young GC中断。在并发标记阶段,若发现区域对象中的所有对象都是垃圾,那个这个区域会被立即回收(图中打X)。同时,并发标记过程中,会计算每个区域的对象活性(区域中存活对象的比例)。

                      

 

4、Remark, 再标记,会有短暂停顿(STW)。再标记阶段是用来收集 并发标记阶段 产生新的垃圾(并发阶段和应用程序一同运行);G1中采用了比CMS更快的初始快照算法:snapshot-at-the-beginning (SATB)。

5、Copy/Clean up,多线程清除失活对象,会有STW。G1将回收区域的存活对象拷贝到新区域,清除Remember Sets,并发清空回收区域并把它返回到空闲区域链表中。

                             

 

6、复制/清除过程后。回收区域的活性对象已经被集中回收到深蓝色和深绿色区域。

                       

 

 

转载:https://www.pianshen.com/article/7018555121/

 

 

 

posted @ 2021-02-22 17:28  彼岸-花已开  阅读(281)  评论(0编辑  收藏  举报