JVM垃圾收集器
Java有四种类型的垃圾回收器:
(1)串行垃圾回收器(Serial Garbage Collector)
(2)并行垃圾回收器(Parallel Garbage Collector)
(3)并发标记扫描垃圾回收器(CMS Garbage Collector)
(4)G1垃圾回收器(G1 Garbage Collector)
上面为新生代收集器,下面是老年代收集器。如果两个收集器之间存在连线,就说明它们可以搭配使用。
一、新生代收集器
(1)Serial(串行GC)收集器
Serial收集器是一个新生代收集器,单线程执行,使用复制算法。它在进行垃圾收集时,必须暂停其他所有的工作线程(用户线程)。是Jvm client模式下默认的新生代收集器。对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率。
(2)ParNew收集器
ParNew收集器其实就是serial收集器的多线程版本,除了使用多条线程进行垃圾收集之外,其余行为与Serial收集器一样。
(3)Parallel Scavenge收集器
Parallel Scavenge收集器也是一个新生代收集器,它也是使用复制算法的收集器,又是并行多线程收集器。parallel Scavenge收集器的目标则是达到一个可控制的吞吐量。吞吐量= 程序运行时间/(程序运行时间 + 垃圾收集时间),虚拟机总共运行了100分钟。其中垃圾收集花掉1分钟,那吞吐量就是99%。
二、老年代收集器
(1)Serial Old收集器(串行)
Serial Old是Serial收集器的老年代版本,它同样使用一个单线程执行收集,使用“标记-整理”算法。主要使用在Client模式下的虚拟机。
(2)Parallel Old收集器(并行)
Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。
(3)CMS收集器(并发)
CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。CMS收集器是基于“标记-清除”算法实现的,一般用在互联网站或者B/S系统的服务器上,整个收集过程大致分为4个步骤:
(1)初始标记(CMS initial mark)
初始标记、重新标记这两个步骤任然需要停顿其他用户线程。初始标记仅仅只是标记出GC ROOTS能直接关联到的对象,速度很快,并发标记阶段是进行GC ROOTS 根搜索算法阶段,会判定对象是否存活。
(2)并发标记(CMS concurrenr mark)
就是进行GC Roots Tracing的过程
(3)重新标记(CMS remark)
修正并发标记期间因用户程序继续运作而导致标记产生变动的把一部分对象的标记记录。
(4)并发清除(CMS concurrent sweep)
整个过程中耗时最长的并发标记和并发清除过程是可以和用户线程一起并发进行。所以总体上来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。
CMS的优点是:并发收集、低停顿。
缺点:
(1)GMS对CPU资源非常敏感
在并发阶段,虽然不会导致用户线程停顿,但是因为CPU会导致应用程序变慢。
(2)无法处理浮动垃圾
由于GMS并发清理阶段用户线程还在运行着,伴随程序运行自然就会有新的垃圾产生,这部分垃圾是出现在标记之后,GMS无法在此次垃圾回收时将新产生的垃圾回收掉。
(3)基于“标记-清除”算法,会产生内存碎片。
三、G1收集器
G1收集器是面向服务端应用的垃圾收集器,具有以下特点
(1)并行与并发
G1能充分利用多CPU、多核环境的硬件优势,使用多个CPU来缩短“stop the world”也就是用户线程的停顿。
(2)分代收集
不需要配合其他的收集器就可以管理整个堆内存。
(3)空间整合
从整体看是采用“标记-整理”算法,从局部看采用复制算法,不管哪种算法都不会产生碎片。
(4)可预测的停顿
这是G1和CMS的优势,降低停顿时间是G1和CMS共同的关注点,但G1除了低停顿外,还可以建立可预测的停顿时间模型,即让使用者可以指定在一个长度为M毫秒的时间内消耗在垃圾回收集上的时间不得超过N毫秒。
在G1中虽然有新生代和老年代,但是他们不再是物力隔离的了,而是一部分Region集合。
通过追踪每个Region里垃圾的价值大小进行回收。
G1收集器的运作可大致划分为四个步骤:
(1)初始标记
标记GC Roots直接关联的对象,依然需要停顿其他线程,但是时间很短。
(2)并发标记
就是进行GC Roots Tracing的过程
(3)最终标记
修正并发标记期间因用户程序继续运作而导致标记产生变动的把一部分对象的标记记录。需要停顿其他线程。
(4)筛选回收
对各个Region中按价值进行筛选。可以与用户线程并发进行。
还没有评论,来说两句吧...