ZGC垃圾回收
ZGC是JDK 11引入的新的垃圾回收机制,宣称能hold住TB级别的heap,暂停时间在10ms下,并且吞吐量最多下降15%。
ZGC的特点:
-
全新: ZGC不是基于CMS或者G1优化的,是全新设计的。
-
使用了Load Barrier技术,而不是Store Barriors技术,zgc使用Load Barrier技术去跟踪堆的状态和对象的状态
-
不分代,ZGC是一个只有一个generation的回收器
-
Partial Compaction,基于部分压缩,和G1一样
-
Region-Base GC, 这点有点类似于G1,都是把内存分成region,但是不同于zgc的固定大小size的region,zgc更加灵活,region的大小可以不一样,这样可以更好地处理大对象的分配问题。
-
immediate memory reuse: zgc和g1一样,region会被及时地清理、压缩和转移,可以让内存的复用更加及时
-
NUMA-aware: 一种内存页合并的硬件技术
-
Colored Object Pointer
-
Concurrent: zgc的一个非常重要的能力,就是并行和并发处理的几乎一样的事情
-
ZGC目前只支持Linux/x86_64
ZGC的heap region被称为 zpages,和G1相比,ZGC的region不会像G1那样一开始就被划分成固定大小的region。zpages的亮点是动态,具体表现是可以动态创建 和销毁,可以动态决定region的大小,其最小的单位是2MB的一个块,每个块的大小就是2MB的倍数。zpages有个概念叫做size groups,有三种:
-
Small: 一个2MB的region
-
Medium: 一个32MB的region
-
Large: N * 2MB的region
Colored Pointer: 是zgc的一个核心概念,也被称做 tag pointers 或者 version pointers, metadata被保存在64位的pointer里,目前不支持32位的平台。
Load Barrier:
load barrier的作用是在对象从heap里load的时候,而且只有在这个地方用到了 laod barrier,一旦通过了Load Barrier并成功得到了对象,之后就可以任意地使用它,比如 访问字段、调用方法等。load barrier的作用主要是检查pointer是否是bad color。如果是一个bad color的pointer,那么就需要走一个慢的路径,餐区一些措施让其变成good color,下次load的时候,就可以走fast path了。
ZGC的过程:
-
初始标记: pause mark start
-
并发标记: Concurrent mark
-
重新分配阶段