经典垃圾回收器

Serial收集器

        Serial是最起初、历史最悠久的收集器 ,是一个单线程收集器,在进行收集时必须暂停所有工作线程 stop the world ,用户不可知。迄今为止Serial依然是hotspot运行在客户端模式下新生代的收集器,简单高效,没有线程交互开销。

 ParNew收集器

        ParNew收集器时Serial收集器的多线程版本,在单核处理器的环境中绝不会有比Serial收集器更好的效果,由于线程交互开销,即使通过超线程伪双核技术也不能百分百超越Serial收集器。 

         

 Parallel Scavenage收集器

         Parallel Scavenage是一款新生代收集器,基于标记-赋值算法实现,目标是控制吞吐量。吞吐量指的是处理器用于运行用户代码的时间与处理小消耗的时间比值。停顿时间越短越适合与用户交互保证响应质量的服务,高吞吐量更适合后台运算不需要太多交互的分析任务。

        -XX:MaxGCPauseMills参数允许设定一个大于0的毫秒数,收集器尽力保证收集时间在用户设定时间范围内,收集时间以牺牲新生代空间和吞吐量换取。

CMS收集器

        CMS收集器是一种获取最短回收停顿时间为目标的收集器,一款基于标记-清理算法实现的回收器,常用于B/S系统服务上关注服务的响应速度,整个过程可分为四部:

        初始标记、并发标记、重新标记、并发清除

        初始标记与重新标记依然要 stop the world 。初始标记阶段仅仅标记Gc Roots能直接关联到的对象,速度很快;并发标记则是从可关联到的对象开始遍历全部对象图,耗时较长但不需要停顿用户线程;重新标记为修正并发标记期间用户线程修改了引用关系的对象标记,挺短时间长于初始标记,远小于并发标记;并发清除,清理死亡的对象。

        缺点:

        1.对资源十分敏感,并发阶段占用一部分线程降低吞吐量,CMS默认启动线程为为(处理器数量+3)/4,如果处理器在四核以上,并发回收线程占用不少于25%资源,随处理器数量增加效率增加。

        2.无法处理浮动垃圾,可能会出现Full Gc导致 stop the world。原因是并发阶段新的垃圾生成,CMS无法处理他们只好等待下一次垃圾回收再进行处理。因为与用户线程并发无法像其他回收期一样等待老年代被几乎全部填满再进行回收必须预留一部分空间给并发垃圾回收使用。

        3.由于基于标记-清理算法,会产生大量的空间碎片。

G1收集器

        Garbage First 收集器是垃圾回收器里程碑的技术成果,开创收集器面向局部Region的内存局部形式。Jdk9发布时G1垃圾收集器已经成为默认Jdk服务器模式下默认的垃圾回收器。

        G1垃圾收集器遵循分代收集器理论设计,但却不再坚持固定大小与固定数量的分代区域划分,而是将java堆划分为多个大小相等独立的Region区域,每一个区域根据需要扮演 Eden Survivor 或者老年代空间,收集器根据region扮演的角色采用不同的策略进行处理。Region中有一类特殊的Humongous区域,专门存储大对象,G1认为只要大小占到Region的一般即视为大对象。Region的大小可通过参数-XX:G1HeapRegionSize设定,范围为1mb~32mb。对于超过 整个Region的对象将会被存放在N个连续的Humongous区域,Humongous视为老年代看待。

 

        G1收集器建立时间停顿模型,可通过参数-XX:MaxGCPauseMillis指定停顿时间默认值是200ms。因为每次收集到的都是Region空间的整数倍,有计划避免全区域垃圾收集,G1收集器会在后台维护一个优先级列表,优先收集价值收益率最大的Region。

        G1垃圾收集器的运作过程分为四个步骤:

        1.初始标记:仅标记Gc Roots可标记到的对象

        2.并发标记:从Gc Roots开始对堆中对象进行可达性分析,递归扫描整个堆中对象图,找出要回收的对象,耗时较长可与用户线程并发运行,扫描完成后重新扫描一次原始快照,处理并发时引用变动的对象。

        3.最终标记:对用户线程做短暂暂停处理,处理并发阶段遗留下来的少量快照记录。

        4.筛选回收:更新Region统计数据,并对Region回收价值和成本进行计算,根据用户设定停顿时间指定回收计划,暂停用户线程,将Region中存活的对象复制到空的Region中后清理旧的Region,由多条收集器线程并发完成。

        缺点:

        1.相比较与CMS,G1中Region跨区引用更为复杂需要消耗大于java堆的10%-20%来维护卡表

        2.G1的写屏障中的操作相较于CMS过大

        3.并发过程中引用指针变化带来的额外负担 

ZGC收集器

         一款在Jdk11新加入具有实验性质的低延迟垃圾收集器,尽可能在吞吐量影响不大的情况下实现在任意堆内存大小下都可以把停顿时间限制在10ms以内的低延迟。一款基于Region内存布局,不设分代,使用读屏障、染色指针和内存多重映射等技术来实现可并发的标记-整理的垃圾收集器。

        ZGC的Region具有动态创建、销毁和动态区域容量大小特性,在x64硬件平台下,ZGC的Region可以具有大(4mb以上)中(256kb-4mb)小(0-256kb)容量

        染色指针

        之前在对象上存储一些额外的信息通常会在对象头增加,例如:对象年龄、哈希码、锁记录等。如果对象被移动过无法有效保证可成功访问,需要其他技术支持如转发指针。ZGC的染色指针直接将信息标记在对象的指针上,这时从前的遍历对象图,变成了遍历引用图。

        染色指针式一种将少量额外信息直接存储在指针上的技术,不支持32位操作系统,不能压缩指针,例如在Linux系统下64为指针高18位不可用来寻址,但剩下的46位指针能支持64TB内存仍可满足大量服务需要。ZGC46位中高4位提取存储4个标志位信息,通过这4位虚拟机可看到对象的三色标记(黑白灰),由于标志位进一步压缩46位的地址空间,导致ZGC管理的内存不可超过4TB。

        优点

        1.染色指针使得一旦某个Region中存活的对象被移动后,这个Region可以被立即释放和重用,不必等待引用修正

        2.染色指针大幅减少垃圾收集过程中内存屏障使用数量,将信息维护到指针不需要再记录对象引用变化情况,提高吞吐量和效率

        3.可作为一种可扩展的存储结构用来标记更多与对象标记、重定位过程相关数据 

        多重映射技术

        在Linux/x86-64平台,ZGC采用多重映射技术,将多个不同虚拟机地址映射到同一物理地址空间,把染色指针的标志位看作地址分段符,映射到同一物理地址,根据多重映射就可以使用染色指针正常寻址 

        ZGC的运作工程:

        并发标记: 与G1大致相同,不同点在于ZGC标记不是在对象上进行而是在指针上进行标记

        并发预备重分配:根据特定查询条件统计本次需要清理哪些Region,将这些Region组成重分配集Region Set。ZGC每次都会扫描所有的Region用大范围的扫描成本换取卡表的维护成本,ZGC的重分配集决定里面存活的Region会被复制到其他Region中,而不是说回收只针对Region Set

        并发重分配:核心阶段,将Region Set中存活对象复制到新的Region中,并为重分配的Region创建转发表,记录新旧对象转换关系。由于染色指针的支持,仅从引用上就可得知对象是否被移动,如果对象被移动则被内存屏障拦截进行引用转发并同时更新引用的值,使其指向新对象,这种行为也被成为指针自愈。

        并发重映射:修正整个Region Set旧对象的引用,由于指针自愈,执行并不迫切。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值