CMS

在这里插入图片描述

枚举根节点

在这里插入图片描述

安全点


在这里插入图片描述

两种中断模式

在这里插入图片描述

安全区域

在这里插入图片描述

在这里插入图片描述
也就是说当业务线程在执行的时如创建对象只有在线程处于安全点和安全区域时才能触发GC 当线程没有处于安全点和安全区域 hostpot虚拟机采用的是主动式中断 。

CMS收集器主体结构

在这里插入图片描述
垃圾收集的线程是可以跟用户(业务)线程同时进行的 ,标记-清除分为两步 标记和清除在cms当中标记分为4步。

标记-清除过程简介

在这里插入图片描述

图示

在这里插入图片描述
由图可以看出初始标记和重新标记时用户线程是暂停的,当并发标记和并发清理,重置线程此时只有4个cpu所有用户线程3就被暂停了

CMS优缺点

在这里插入图片描述
这里的低停顿是指降低用户线程的停顿时间
在这里插入图片描述

空间分配担保

在这里插入图片描述

CMS 具体步骤(7种)

在这里插入图片描述
Concurrent Preclean:并发 预先清除
Concurrent Abortable Preclean:并发 可能失败的 预先清理
Concurrent ReSet:并发重置

Initial Mark 初始标记

初始标记就是标记老年代当中被GCroots和年轻代引用的对象
在这里插入图片描述

Concurrent Mark 并发标记

在这里插入图片描述
并发标记阶段就是找到被GC roots直接或间接引用的对象进行标记但是由于并发标记可能在初始标记的对象在此阶段被用户线程改变引用如在业务代码指定了某个对象静态类型的引用为null。如上图被间接引用的就由于发生改变就不会被标记。

Concurrent Preclean 并发预清理

在这里插入图片描述
在这里插入图片描述

  • JVM会将老年代内存划分成多个card区域,当card区域被引用线程修改该区域就称为dirty card脏区域
  • Concurrent-Preclean 预清理 主要是清理这些脏区域的引用并将其对应的引用更新并标记。同时将该区域清理恢复成card区域

Concurrent Abrotable Preclean 并发可能失败的预清理

在这里插入图片描述
作用1.与preclean相似 2.尽可能保证新生代干净,缓解final-remark的压力

在这里插入图片描述

Final Remark 重新标记

在这里插入图片描述
在这里插入图片描述

Concurrent Sweep 并发清除

在这里插入图片描述

Concurrent Reset 并发线程重置

在这里插入图片描述

总结

在这里插入图片描述
在这里插入图片描述

示例

/**
 * -verbose:gc -Xms20M -Xmn10M -Xmx20M -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC JVM启动参数
 * 指定了-XX:+UseConcMarkSweepGC 参数 默认会使用ParNew收集器收集新
 */
public class MyTest5 {

    public static void main(String[] args) {
        int size = 1024 * 1024;

        byte[] myAllocl1 = new byte[4 * size];
        System.out.println("11111111");
        byte[] myAllocl2 = new byte[4 * size];
        System.out.println("22222222");
        byte[] myAllocl5 = new byte[4 * size];
        System.out.println("33333333");
        byte[] myAllocl6 = new byte[2 * size];
        System.out.println("44444444");
    }
}

/*
11111111
//第二次 Eden空间满了
[GC (Allocation Failure) [ParNew: 6410K->1022K(9216K), 0.0037960 secs] 6410K->2800K(19456K), 0.0038452 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
22222222
[GC (Allocation Failure) [ParNew: 5276K->103K(9216K), 0.0028531 secs] 7053K->6996K(19456K), 0.0028690 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
//老年代垃圾收集
[GC (CMS 初始标记)[1 CMS-初始-mark: 老年代使用空间(总空间10M=20M-10M)] 堆总使用空间(总堆空间19M),执行时间][时间戳]
[GC (CMS Initial Mark) [1 CMS-initial-mark: 6893K(10240K)] 11092K(19456K), 0.0001701 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[CMS-concurrent-mark-start] //并发标记开始
33333333
44444444
//并发标记完成
[CMS-concurrent-mark: 0.002/0.002 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
//预先清理 开始
[CMS-concurrent-preclean-start]
 //清理完成
[CMS-concurrent-preclean: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
// 可能失败的预先清理 开始
[CMS-concurrent-abortable-preclean-start]
//完成 可能失败的预先清理
[CMS-concurrent-abortable-preclean: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
// 重新标记
[GC (CMS Final Remark) [年轻代占用空: 当前(总9M)][重新扫描,时间][弱引用处理,处理时间][类的卸载][符号表][字符串表]
[1 CMS-remark: 标记对象占用空间(老年代总空间10M)] 堆使用空间(堆总空间), 0.0021756 secs]

[GC (CMS Final Remark) [YG occupancy: 6404 K (9216 K)][Rescan (parallel) , 0.0014258 secs][weak refs processing, 0.0000657 secs][class unloading, 0.0002423 secs][scrub symbol table, 0.0003203 secs][scrub string table, 0.0000754 secs][1 CMS-remark: 6893K(10240K)] 13298K(19456K), 0.0021756 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
// 并发 标记清除 开始
[CMS-concurrent-sweep-start]
//并发 标记清除 完成
[CMS-concurrent-sweep: 0.001/0.001 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
//并发 线程整理 开始
[CMS-concurrent-reset-start]
//并发 线程整理 完成
[CMS-concurrent-reset: 0.000/0.000 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]


Heap
 par new generation   total 9216K, used 6845K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)
  eden space 8192K,  83% used [0x00000000fec00000, 0x00000000ff2af490, 0x00000000ff400000)
  from space 1024K,   0% used [0x00000000ff400000, 0x00000000ff400000, 0x00000000ff500000)
  to   space 1024K,   0% used [0x00000000ff500000, 0x00000000ff500000, 0x00000000ff600000)
 concurrent mark-sweep generation total 10240K, used 6525K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)
 Metaspace       used 4569K, capacity 4752K, committed 4992K, reserved 1056768K
  class space    used 513K, capacity 566K, committed 640K, reserved 1048576K


 */
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐