美文网首页java
自己瞎叨叨两句ZGC

自己瞎叨叨两句ZGC

作者: 扎瓦叔叔 | 来源:发表于2019-10-17 18:32 被阅读0次

    啥是zgc?

    一种可扩展的低延迟垃圾收集器

    它的目标:

    • 大堆收集
    • 最大延迟时间不超过10ms
    • gc停顿不会受到堆大小的影响
    • 为未来的gc功能奠定基础

    特点:

    新的垃圾回收器
    负载屏障
    有色指针
    不分代
    部分压缩
    基于region划分
    内存即时重用
    NUMA支持

    并发处理

    标记
    复制和压缩
    重定位集的选择
    引用的处理
    JNI WeakRefs的清理
    StringTable / SymbolTable清洁
    类卸载

    测试数据

    停顿时间.png 吞吐量.png

    gc流程

    1. 停顿【标记开始】
      • 对指向gcroots的对象进行标记
      • 并发标记/remap,根据对象关系标记对象
    2. 停顿【标记结束】
      • 同步点(弱引用清理)
      • 并发准备重定位,引用处理,弱引用清理,重定位集选择
    3. 停顿【重定位开始】
      • 将引用roots的对象写入重定位集
      • 并发重定位,在重定位集中


        gc cycle.png

    Heap Regions

    • 动态创建/销毁
    • 动态创建大小为2MB的倍数(x86_64)
    • 大小选择
      • Small(2MB)
      • Medium(32MB)
      • Large(N*2MB)

    有色指针

    • 有色指针是zgc的核心设计理念
    • 元数据:存储在64位指针的未使用位中
      • 不支持32位平台
      • 不支持压缩操作
    • 虚拟地址掩码:硬件,操作系统,软件都支持
      • 在Linux / x86_64上进行堆多映射
      • 支持Solaris / SPARC的硬件
    有色指针.png

    Load Barrier

    1.从堆上加载对象引用时,不是以后使用该引用访问对象的时候
    Object o = obj.fieldA;
    <load barrier needed here>
    Object p = o; // No barrier, not a load from heap
    o.doSomething(); // No barrier, not a load from heap
    int i = obj.fieldB; // No barrier, not an object reference
    2.如果指针上的颜色是bad color(mark/relocate/remap),则修复它(repair/heal)
    3.针对常见情况进行了优化

    条形标记

    • 将堆分成多个逻辑域
    • 每个gc线程对应负责一个或多个逻辑条状域


      条状标记.png

    gclog

    gclog.png gclog2.png

    参考文章:ZGC--Low-Latency-GC
    觉得不错的文章,分享下:https://houbb.github.io/2018/11/28/java-gc-optimize

    相关文章

      网友评论

        本文标题:自己瞎叨叨两句ZGC

        本文链接:https://www.haomeiwen.com/subject/rdrmmctx.html