美团面试官问我: ZGC 的 Z 是什么意思(下)

简介: 美团面试官问我: ZGC 的 Z 是什么意思(下)

初始转移

这个阶段其实就是从根集合出发,如果对象在转移的分区集合中,则在新的分区分配对象空间。

如果不在转移分区集合中,则将对象标记为 Remapped。

注意这个阶段是 STW,只转移根直接可达的对象。


并发转移

这个阶段和并发标记阶段就很类似了,从上一步转移的对象开始遍历,做并发转移。

这一步很关键。

G1 的转移对象整体都需要 STW,而 ZGC 做到了并发转移,所以延迟会低很多。

至此十个步骤就完毕了,一次 GC 结束。

可以还能同学对染色指针的几个标记位有点懵,没事看了下文就懂了。


染色指针的标记位


来分析下几个标记位,M0、M1、Remapped。

先来介绍个名词,地址视图:指的就是此时地址指针的标记位。

比如标记位现在是 M0,那么此时的视图就是 M0 视图。

在垃圾回收开始前视图是 Remapped 。

进入标记标记时。

标记线程访问发现对象地址视图是 Remapped 这时候将指针标记为 M0,即将地址视图置为 M0,表示活跃对象。

如果扫描到对象地址视图是 M0 则说明这个对象是标记开始之后新分配的或者已经标记过的对象,所以无需处理。

应用线程 如果创建新对象,则将其地址视图置为 M0,如果访问的对象地址视图是 Remapped 则将其置为 M0,并且递归标记其引用的对象。

如果访问到的是 M0 ,则无需操作。

标记阶段结束后,ZGC 会使用一个对象活跃表来存储这些对象地址,此时活跃的对象地址视图是 M0。

并发转移阶段,地址视图被置为 Remapped 。

也就是说 GC 线程如果访问到对象,此时对象地址视图是 M0,并且存在或活跃表中,则将其转移,并将地址视图置为 Remapped 。

如果在活跃表中,但是地址视图已经是 Remapped 说明已经被转移了,不做处理。

应用线程此时创建新对象,地址视图会设为  Remapped 。

此时访问对象如果对象在活跃表中,且地址视图为 Remapped  说明转移过了,不做处理。

如果地址视图为 M0,则说明还未转移,则需要转移,并将其地址视图置为 Remapped  。

如果访问到的对象不在活跃表中,则不做处理。

那 M1 什么用

M1 是在下一次 GC 时候用的,下一次的 GC 就用 M1来标记,不用 M0。

再下一次再换过来。

简单的说就是 M1 标识本次垃圾回收中活跃的对象,而 M0 是上一次回收被标记的对象,但是没有被转移,在本次回收中也没有被标记活跃的对象。

其实从上面的分析以及得知,如果没有被转移就会停留在 M0 这个地址视图。

而下一次 GC 如果还是用 M0 来标识那混淆了这两种对象。

所以搞了个 M1。

至此染色指针这几个标志位应该就很清晰了,我在用图来示意一下。


image.png


不清晰的同学建议再多看几遍标记位的变更,不复杂的。


最后


简单的总结下,ZGC 就是通过多阶段的并发和几个短暂的 STW 阶段来达到低延迟的特性。

利用指针染色技术和读屏障实现并发转移对象,利用 STAB 保证并发阶段不会漏标对象。

这一波一下相信大家对于 ZGC 有了一定的了解。

我个人认为重点就掌握官网罗列的那几个要点就行,毕竟咱们也不是写 GC 的,作为了解即可。

到时候和学妹呀,或者在面试官前面呀都可以小吹一下。

如果想深入了解当然可以,可先看看《新一代垃圾回收器ZGC设计与实现》这本书,然后再源码走起。

ZGC 的不分代其实是它的缺点,因为分代比较难实现,不过以后应该会加上吧。

其实从现代垃圾收集器的演进可以看出就是往并发上面靠,目标就是减少停顿的时间。

不过并发需要注意内存分配的速率,因为并发导致一次垃圾回收总的时间变长了

如果内存分配过快那就回收不过来了,因此都需要预留内存空间或者说要更大的内存空间来应对快速的分配速率。

可能大伙还惦记这标题吧?ZGC 的 Z 是什么意思?

其实没啥意思,就是个名字而已。


image.png

微信搜 「yes的练级攻略」干货满满,不然来掐我,回复【123】一份20W字的算法刷题笔记等你来领。 更多文章可看我的文章汇总:github.com/yessimida/y… 欢迎 star !


巨人的肩膀





相关文章
|
2月前
|
存储 缓存 监控
美团面试:说说OOM三大场景和解决方案? (绝对史上最全)
小伙伴们,有没有遇到过程序突然崩溃,然后抛出一个OutOfMemoryError的异常?这就是我们俗称的OOM,也就是内存溢出 本文来带大家学习Java OOM的三大经典场景以及解决方案,保证让你有所收获!
185 0
美团面试:说说OOM三大场景和解决方案? (绝对史上最全)
|
4月前
|
NoSQL 算法 Java
面试美团被问到了Redis,搞懂这几个问题,让你轻松吊打面试官
每一个程序员都拥有一座大厂梦,很多Java开发者面试之前,可能没有较长的工作时间或者较为丰富的工作经验,所以不知道互联网公司或者一线互联网公司技术面试都会问哪些问题? 再加上可能自己准备也不充分,去面试没几个回合就被面试官几个问题打蒙了,最后以惨败收场。
|
1月前
|
设计模式 网络协议 Java
美团面试,问的贼细~
美团校招面试涵盖网络(HTTP/TCP/UDP)、框架(Spring的IoC/AOP)、设计模式(静态代理)、编程(手写静态代理)、MySQL(事务隔离级别)、Java基础(数据类型/Integer与int的区别)、HashMap等知识点。面试从自我介绍开始,深入到技术细节,如TCP的三次握手和四次挥手,GET与POST请求的区别,以及MySQL的不可重复读示例。了解更多详情可访问[www.javacn.site](https//www.javacn.site)。
39 1
美团面试,问的贼细~
|
2月前
|
消息中间件 存储 监控
美团面试:Kafka如何处理百万级消息队列?
美团面试:Kafka如何处理百万级消息队列?
135 1
|
3月前
|
NoSQL 安全 Java
差点跳起来了!全靠这份999页Java面试宝典,我刚拿到美团offer
事情是这样的,今年年初,在某个大博主那里拿到一份Java面试宝典,然后就一直躺在盘里吃灰,直到5月份的时候,有了要跳槽的计划和打算,就想着要刷刷面试题,所以就把这套“积灰”的面试宝典拿出看了看,这一看就看了一个多月才算是完整的吃透。7月中旬开始面试美团了,前后差不多5面的样子,原本以为没啥希望,等到月底29号收到了offer,通知8月3号到公司报到,看到邮件那一刻差点跳起来了!
|
3月前
|
存储 前端开发 JavaScript
美团面试官:那你讲一讲Vuex吧
美团面试官:那你讲一讲Vuex吧
|
4月前
|
消息中间件 缓存 算法
美团面试官让我聊聊kafka的副本同步机制,我忍不住哭了
美团面试官让我聊聊kafka的副本同步机制,我忍不住哭了
|
4月前
|
消息中间件 缓存 架构师
复习这份美团架构师的Java核心面试宝典,我四面阿里拿下offer
怎样才能拿到大厂的offer,没有掌握绝对的技术,那么就要不断的学习 他是如何拿下阿里等大厂的offer的呢,今天分享他的秘密武器,美团资深架构师整理的Java核心知识点,面试时面试官必问的知识点,篇章包括了很多知识点,其中包括了有基础知识、Java集合、JVM、多线程并发、spring原理、微服务、Netty 与RPC 、Kafka、日记、设计模式、Java算法、数据库、Zookeeper、分布式缓存、数据结构等等。
|
4月前
|
SQL 算法 安全
面试美团、头条、百度、京东,一名3年Java开发经验的面试总结
毕业转行做开发3年以来, 学到了很多, 加上自己的兴趣爱好, 个人认为已经成为了一个合格的程序员. 与刚开始找工作面试相同的是都会问一些相同的问题, 不同的是现在面试官会更注重为什么, 也就是说注重深度而非广度. 3年, 5年, 10年分别是个人从事技术方面职业规划中的一个坎, 3年大部分时间应对了业务逻辑, 培养良好的规范和思想, 基础知识还是欠缺.
|
4月前
|
机器学习/深度学习 算法 定位技术
美团、滴滴、蔚来、货拉拉、Momenta、易智瑞、昆仑万维等暑期实习、日常实习技术岗面试汇总
美团、滴滴、蔚来、货拉拉、Momenta、易智瑞、昆仑万维等暑期实习、日常实习技术岗面试汇总