• JVM垃圾收集器总结


    一.经典的垃圾收集器:

    Serial收集器:

    (1)最基础最悠久的收集器
    (2)工作在新生代:复制算法 
    (3)Stop the World
    

    ParNew收集器

    (1)多线程版的Serial
    (2)可以与CMS配合使用
    (2)工作在新生代
    

    Parallel Scavenge收集器

    (1)和前两款收集器相比,更注重吞吐量。(前两款注重垃圾收集时间)
    (2)-XX:MaxGCPauseMillis 	收集器将尽量使得每次的收集时间小于此参数,参数值越小,垃圾收集越频繁
    (3)-XX:GCTimeRatio 
    (4)自动调整参数的策略叫做自适应的调节策略
    (5)工作在新生代
    (6)多线程
    

    Serial Old

    (1)老年代的Serial
    (2)工作在老年代:标记整理算法 
    

    Parallel Old

    (1)Parallel Scavenge的老年代版本
    

    CMS收集器

    (1)以最短回收停顿时间为目标的收集器
    (2)工作在老年代,标记清除算法
    (3)并发低停顿收集器
    (4)多核机器表现良好,核心不足则表现较差
    (5)i-CMS用在核心不足的机器上以提升性能,但是效果不佳
    (6)可能因为无法处理浮动垃圾而启动Serial Old进行老年代的垃圾收集
    (7)工作步骤:
    	初始标记(STW)
    	并发标记
    	重新标记(STW) :增量更新
    	并发清理
    

    Garbage First(G1)

    (1)工作在新生代和老年代,但内存分区不在固定,G1将内存划分为多个CSet,专注于垃圾多的地方
    (2)JDK9 开始为默认垃圾收集器
    (3)基于Region的堆内存布局,每一个Region的分代不固定
    (4)超过一个Region一半的对象为大对象,发在Humongous Region中
    (5)由于存在跨Region的引用,每个region都要维护一个双向卡表,G1需要耗费Java堆容量的10%~20%,比一般垃圾收集器占用内存更多
    (6)TAMS :每个Region两个,用于新对象的创建
    (7)工作步骤:
    	初始标记
    	并发标记:仅此不需要暂停用户线程
    	最终标记:原始快照
    	筛选回收
    

    二.低延迟的垃圾收集器

    Shenandoah

    非官方收集器

    (1)连接矩阵:代替了记忆集 (这东西就是图论中的连接矩阵)	
    
    (2)工作阶段
    	初始标记  :  用于标记GC ROOT (STW)
    	并发标记  :  标记出全部可达对象
    	最终标记  :  
    	并发清理  :  清理完全没有存活对象的region
    	并发回收  :  将存活对象移动到未使用的region
    	初始引用更新:复制完之后更新引用,但这一步仅仅做了一个确认:所有复制任务都已经完成
    	并发引用更新:真正开始的引用更新操作
    	最终引用更新:更新GC root中的引用,STW
    	并发清理 :  赋值完之后,清理赋值前的原对象
    (2)  brooks point
    	位于对象最前面的一个引用字段,不发生并发移动时指向自己.
    	用于引用更新,之前对象移动时,通过保护陷阱解决问题
    

    ZGC

    ZGC收集器是一款基于Region内存布局的,不设分代的,使用了读屏障,染色指针和内存多重映射等技术实现可并发的标记整理算法的,以低延迟为首要目的的一款垃圾收集器.

    (1)region
    	小型region:2MB,对象<=256KB
    	中型region:32MB,对象<=4MB
    	大型region:一个region一个对象,总容量必须是2MB的倍数
    (2)指针染色技术:
    	使用地址指针的前四位进行标记.
    	使用多重映射解决机器硬件不支持问题
    (3)最大内存管理:   4TB
    (4)工作阶段:
    	并发标记:
    	并发预备重分配:记录存活对象会被重新赋值到哪个region
    	并行重分配:   自愈	转发表
    	并发重映射:  更正所有的旧引用,实际放在并发标记完成
    (5)支持 非统一内存访问架构(NUMA-Aware)
    

    Epsilon

    无操作
    适用于小应用
    

    总结

    一个垃圾收集器收集垃圾,其实就是两个部分:
    标记,清理
    对于Serial,ParNew,Parallel Scavenge,Serial Old,Parallel Old这些收集器来说,工作阶段就是这两个
    他们几个的区别,主要体现在工作区域和是否多线程
    CMS的工作阶段有四个,初始标记,并发标记,重新标记,并发清除.你仔细一看,那还是标记和清理
    G1的工作阶段与CMS相似,初始标记,并发标记,最终标记,筛选回收.与CMS的不同之处主要体现在内存布局,垃圾标记的算法之上
    Shenandoah的工作阶段更多,初始标记,并发标记,最终标记,并发清理,并发回收,初始引用更新,并发引用更新,最终引用更新,并发清理. 这引用更新是为了解决移动对象时的STW问题

    注意:
    1.上图中的标记并发不包括枚举GC root,如果枚举GC root,一定要STW
    2.使用标记复制,标记整理算法会引发STW,但是Shenandoah通过Brooks Pointer,ZGC通过染色指针和转发表解决了此过程STW问题

  • 相关阅读:
    tcpdump高级过滤
    Flask简单学习
    nginx+keepalived高可用web负载均衡
    Golang基础(5):Go语言反射规则
    Golang基础(4):Go结构体
    分布式SESSION一致性
    JSON WEB TOKEN (JWT)
    Table布局
    GRID布局
    三种方式实现轮播图功能
  • 原文地址:https://www.cnblogs.com/ZGQblogs/p/12581585.html
Copyright © 2020-2023  润新知