JVM垃圾收集器:CMS与G1
JVM垃圾收集器:CMS与G1
一、CMS垃圾收集器
CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。
基于“标记-清除”算法实现:
包括步骤:
1、CMS intial mark(初始标记):标记GC Roots能直接关联到的对象,速度很快
2、CMS concurrent mark(并发标记):进行GCRoot Tracing过程(用来判断对象是否与GC root有引用链)
3、CMS remark(重新标记):修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,停顿时间长于初始标记,但是时间远远少于并发标记。
4、CMS concurrent sweep(并发清除):清除回收对象
其中初始标记与重新标记需要“stop the world”。其他两个并发标记与并发清除过程CMS收集器线程可以与其他用户线程一起运行,所以从总体上来说,该手机其是与用户线程一起并发执行的。
主要优点:并发手机,低停顿。
缺点:
1、CMS收集器对CPU资源非常敏感。因为并发,占用了一定的CPU资源,导致应用程序变慢。其默认启动的垃圾回收线程数量为:(CPU数量+3)/4
所以占了至少25%的资源。
解决方法:Incremental Concurrent Mark Sweep(i-CMS) 增量并发收集器。在并发标记、清理的时候让GC线程、用户线程交替运行。尽量减少GC线程独占资源的时间。这样的缺点就是整个垃圾收集的过程会更长,但是对用户程序的影响就更小。但是事实证明,该搜收集器效果很差。
2、CMS收集器无法处理浮动垃圾(Floating Garbage),可能出现“Concurrent Mode failure”失败而导致另一次Full GC的产生。
由于CMS并发清理阶段用户线程还在运行着,伴随这程序的运行就自然会有垃圾生成,这些垃圾是无法在当次的回收过程中回收的,要等到下一次回收,这些垃圾就叫做浮动垃圾。
3、基于标记清除算法,会产生大量的空间碎片,由于太多碎片,导致无法给大对象分配空间,又会产生Full GC。
二、G1收集器
(Garbage-First)G1收集器是当今收集器技术发展最前沿的成果之一。
特点如下:
1、并发与并行:G1能充分利用CPU、多核环境下的硬件优势,使用多个CPU(CPU或者CPU核心)来缩短Stop-the-world的时间,部分其他收集器原本原本需要停顿JAVA核心线程执行的GC动作,G1收集器仍然可以通过并发的方式让JAVA程序继续执行。
2、分代收集。能够采用不同的方式去处理新创建的对象和已经存活了一段时间、熬过多次GC的旧对象以获取更好的收集效果
3、空间整合:整体基于 标记-整理算法,局部基于复制算法实现。不会产生空间碎片
4、可以预测的停顿:除了追求降低停顿以外,还建立可预测的停顿时间模型,能让使用者明确指定在一个长度为M毫秒的时间片段内,小号在垃圾收集器上的时间少于N毫秒。
G1不再是对收集的防卫整个都是新生代或者老年代。其将整个JAVA对划分为多个大小相等的独立区域,新生代与永久带不再是物理隔离。
G1跟踪各个Region里面的垃圾堆积的价值大小(回收所获得的空间大小以及回收所需的时间经验),在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region(Garbage-First来由)。
G1中灭个Region都有一个与之对应的Remembered Set,用来避免全堆扫描。jvm发现程序对reference进行写操作时,会产生一个write barrier暂时中断写操作,检查reference引用的对象是否处于不同的region之中,如果是则记录到remembered set当中,当进行内存回收的时候,避免全盘扫描也不会有遗漏。
G1操作可以分为以下 步骤
1、Initail Marking(初始标记):标记一下GC Roots能直接关联到的对象,并且修稿TAMS(next Top at Mark Start)的值
2、Concurrent Marking(并发标记),进行可达性分析,找出存活对象
3、Final Marking(最终标记):修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分标记记录,这段时间对象变化记录合并到Remenbered Set中。
4、Live Data Counting and Evacution(筛选回收)