首页 > 编程知识 正文

垃圾回收器的作用(中国长安)

时间:2023-05-03 07:00:06 阅读:96317 作者:4316

00-1010支持的版本

目标

jdk11版本最多可支持4TB内存。

Jdk13最多可支持16TB内存

最大暂停时间小于10毫秒。

吞吐量减少了15%,也就是说,如果没有ZGC,回收需要1000毫秒。

与ZGC一起回收需要1150毫秒。

没多大关系。不管怎样,stw时间缩短了。

暂时不分世代

与ZGC的底层算法相比,实现生成还是比较麻烦的,生成还没有实现。

现在还是一个简单的版本,将来可能会分几代。

也就是说,对象生命周期的不一致性还没有解决。

产生的必要性

对象有一个生命周期。

年轻一代是死亡的对象。

老年永远是老不死的对象。

如果老一代像年轻一代一样快死了,也没关系。

整个堆必须一直是垃圾收集的。

ZGC存储器布局

类似于G1,它被分成一个小的记忆区域。

不同的是没有世代的概念。

只能区分小、中、大区域。

简介

NUMA

统一内存访问架构

所有的中央处理器同时访问内存。

然后会有对记忆的争夺。

失败会导致锁定竞争。

即使使用CAS,仍然有损失。

但是使用UNMA将避免这种情况。

上端内存区(Upper Memory Area)

多个中央处理器同时访问同一个内存

每个cpu访问不同的内存块

每个内存块允许一个特定的cpu拥有优先访问权。

避免分配内存和争夺内存资源的问题。

ZGC底层可以自动识别NUMA建筑。

ZGC操作过程

gc过程中最耗时的阶段是并发标记和并发清理。zgc将并发清理阶段分为并发准备重分发阶段和并发重分发阶段。

G1是STW在筛选恢复阶段。

Shenandoah基于G1,相当于G1的升级版。

许多在G1未实现的功能在谢南多阿实现。

例如,Shenandoah在筛选和回收阶段实现了并发。

并行标记

G1和CMS在同时标记阶段有一个三色标记。这些标记都在对象头的gc标记上。ZGC不会将标记信息放在对象内部,而是放在存储对象的内存空间的指针上。这是颜色指针。

8ded692?from=pc">

并发预分配

类比g1的计算回收收益比 看看哪些region需要回收 哪个region回收收益比高 计算好之后 zgc不是马上去清理 g1此时会马上清理 每次gc都会扫描所有的region 没有g1中的卡表(remember set 记忆集)的维护成本

并发重分配

将存活对象复制到另一块区域 那么这些对象的引用地址都变了 如果是g1的话筛选回收阶段 因为它是stw的 将对象复制过来之后 就会立马修改引用 但zgc这个过程是和用户线程并发执行的 所以不能直接将老的引用地址修改为新的 zgc是通过读屏障实现的 当读取到老的引用的之后 通过引用中的颜色指针判断引用是否变更 就会将新的引用替换掉老的引用

对象变更的几个点

并发标记时新增的对象将这样的对象用黑色标记 下一次gc过程再回收 并发标记时老的对象状态变更这部分对象在重新标记或最终标记的过程会修正 比如存活对象变成了垃圾对象就会讲gcroot引用链上剔除 将存活对象复制到新的region区CMS 并发清理 ,过程中的新增对象用黑色标记 下次gc回收 G1 筛选回收 该过程stw 直接将对象老的地址更新为新的 ZGC 并发重分配 将新-老映射关系记录在转发表 用户线程访问访问老的对象时会通过转发表路由到新的地址

并发重映射过程

该过程就是将gcroot上老的对象引用更新为新的对象引用 这个过程实际上并没有做处理 而是将这个过程放在了下一次gc并发标记中去了 这样就节省了一次遍历对象图的开销 一旦所有指针被修正了之后 原来记录新旧对象关系转发表就可以释放了

颜色指针(染色指针)

颜色指针不可以被压缩

32位可以做指针压缩 总共64位 小于等于35位 即<=32G 可以做指针压缩 可以压缩到32位去存储 cpu寻址还是用的35位 真正使用的时候 还要解压缩变成35位才能够寻址到完整的32个g cpu使用的是是35位 存到内存对象中压缩成32位了 jvm目前实现 最多35位之内的可以做指针压缩 zgc至少用42+4=46位 所以没有办法做指针压缩

读屏障

在并发重新分配阶段 将有效对象复制到另外一个空的region区中 原有的引用地址要更新 (惰性更新) 将从堆中拿老的对象值的时候

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。