「字节跳动」厉害!代表Java未来的ZGC深度剖析( 二 )
接下来 , 再看一下ZGC的垃圾回收过程 , 如下图所示 。 由图我们可知 , ZGC依然没有做到整个GC过程完全并发执行 , 依然有3个STW阶段 , 其他3个阶段都是并发执行阶段:
- Pause Mark Start
- Concurrent Mark/Remap
- Concurrent Prepare for Relocate
relocate
- Concurrent Relocate
Single Generation单代 , 即ZGC「没有分代」 。 我们知道以前的垃圾回收器之所以分代 , 是因为源于“「大部分对象朝生夕死」”的假设 , 事实上大部分系统的对象分配行为也确实符合这个假设 。
那么为什么ZGC就不分代呢?因为分代实现起来麻烦 , 作者就先实现出一个比较简单可用的单代版本 。 用符合我们国情的话来解释 , 大概就是说:工作量太大了 , 人力又不够 , 老板 , 先上个1.0版本吧!!!
Region Based这一点和G1一样 , 都是基于Region设计的垃圾回收器 , ZGC中的Region也被称为「ZPages」 , ZPages被动态创建 , 动态销毁 。 不过 , 和G1稍微有点不同的是 , G1的每个Region大小是完全一样的 , 而ZGC的Region大小分为3类:2MB , 32MB , N×2MB , 如此一来 , 灵活性就更好了:
Partial Compaction部分压缩 , 这一点也跟G1类似 。 以前的ParallelOldGC , 以及CMS GC在压缩Old区的时候 , 无论Old区有多大 , 必须整体进行压缩(CMS GC默认情况下只是标记清除 , 只会发生FGC时才会采用Mark-Sweep-Compact对Old区进行压缩) , 如此一来 , Old区越大 , 压缩需要的时间肯定就越长 , 从而导致停顿时间就越长 。
而G1和ZGC都是基于Region设计的 , 在回收的时候 , 它们只会选择一部分Region进行回收 , 这个回收过程采用的是Mark-Compact算法 , 即将待回收的Region中存活的对象拷贝到一个全新的Region中 , 这个新的Region对象分配就会非常紧凑 , 几乎没有碎片 。 垃圾回收算法这一点上 , 和G1是一样的 。
NUMA-awareNUMA对应的有UMA , UMA即Uniform Memory Access Architecture , NUMA就是Non Uniform Memory Access Architecture 。 UMA表示内存只有一块 , 所有CPU都去访问这一块内存 , 那么就会存在竞争问题(争夺内存总线访问权) , 有竞争就会有锁 , 有锁效率就会受到影响 , 而且CPU核心数越多 , 竞争就越激烈 。 NUMA的话每个CPU对应有一块内存 , 且这块内存在主板上离这个CPU是最近的 , 每个CPU优先访问这块内存 , 那效率自然就提高了:
推荐阅读
- 字节跳动■印度封杀中国APP效果立竿见影?抖音被禁用,字节跳动损失420亿!
- 前线观察员|字节跳动高管说大实话,张忠谋曾如此对中芯,得亏老干妈家大业大
- 上游新闻|无电无光也能拍到高清图像,厉害了华为摄像机!“四无设计”突破时空限制
- 「昆虫」见过算你厉害——奇异的动物和昆虫
- [腾讯]字节跳动副总裁嘲讽腾讯:事情搞不清楚就起诉?腾讯晒照片回击硬刚
- 【抖音】印度封禁中国APP有效果了?抖音被禁用,字节跳动损失420亿!
- 抖音:印度封杀中国APP初见成效?抖音被禁用,字节跳动损失420亿!
- 稻草人在线|记性不好”,与腾讯隔空喊话,字节副总回应“知识储备不足
- 腾讯▲鹅厂有难,阿里、百度,当当、字节跳动神补刀,腾讯自嘲乐翻天
- 竺道|ShareChat公司推出短视频应用Moj,欲取代字节跳动的TikTok
