ZGC介绍
Z Garbage Collector,即ZGC,基于Region内存布局,不设置分代, 使用了读屏障, 染色指针和内存多重映射等技术实现的可并发标记-整理算法的,是一个可伸缩的、低延迟的垃圾收集器,主要为了满足如下目标进行设计:
- 停顿时间不会超过10ms
- 停顿时间不会随着堆的增大而增大(不管多大的堆都能保持在10ms以下)
- 可支持几百M,甚至几T的堆大小(最大支持4T)
和G1开启很像,用下面参数即可开启:
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC
ZGC特性
- Concurrent(并发执行)
- Region-based(内存基于region,类似G1)
- Compacting(压缩)
- NUMA-aware(Numa架构,一种内存页合并的硬件技术)
- Using colored pointers(着色指针)
- Using load barriers(读屏障)
(1)Concurrent
ZGC只有短暂的STW,大部分的过程都是和应用线程并发执行,比如最耗时的并发标记和并发移动过程。
(2)Region-based
ZGC中没有新生代和老年代的概念,只有一块一块的内存区域page,这和G1的region有点像,但和G1不一样的是,region的大小更加灵活和动态。zgc的region不会像G1那样在一开始就被划分为固定大小的region。
zgc的region核心亮点就是:动态。
动态表现为:
- 动态地创建和销毁。
- 动态地决定region的大小。它的最小单位是2MB的一个块。然后每个region的大小就是是2MB*N就是。
(3)Compacting
每次进行GC时,都会对page进行压缩操作,所以完全避免了CMS算法中的碎片化问题。
(4)NUMA-aware
(2)Colored Pointers
是zgc的一个核心概念。你还可以叫它tag pointers,version pointers。
和以往的标记算法比较不同,CMS和G1会在对象的对象头进行标记,而ZGC是标记对象的指针。
在这里插入图片描述
一个pointer共64bit。开始的18bit暂时没有被用到(以后有可能要用),然后是四个bit,分别表示Finalizable、Remapped、Marked1、Marked0,这是gc过程中每个对象的状态。最后42bit是用来存储对象的地址。
(3)Using load barriers
因为在标记和移动过程中,GC线程和应用线程是并发执行的,所以存在这种情况:对象A内部的引用所指的对象B在标记或者移动状态,为了保证应用线程拿到的B对象是对的,那么在读取B的指针时会经过一个 “load barriers” 读屏障,这个屏障可以保证在执行GC时,数据读取的正确性。
网友评论