啥是zgc?
一种可扩展的低延迟垃圾收集器
它的目标:
- 大堆收集
- 最大延迟时间不超过10ms
- gc停顿不会受到堆大小的影响
- 为未来的gc功能奠定基础
特点:
新的垃圾回收器
负载屏障
有色指针
不分代
部分压缩
基于region划分
内存即时重用
NUMA支持
并发处理
标记
复制和压缩
重定位集的选择
引用的处理
JNI WeakRefs的清理
StringTable / SymbolTable清洁
类卸载
测试数据
![](https://img.haomeiwen.com/i10870103/6e6646461a755888.png)
![](https://img.haomeiwen.com/i10870103/8966b6d0d32cd9d9.png)
gc流程
- 停顿【标记开始】
- 对指向gcroots的对象进行标记
- 并发标记/remap,根据对象关系标记对象
- 停顿【标记结束】
- 同步点(弱引用清理)
- 并发准备重定位,引用处理,弱引用清理,重定位集选择
- 停顿【重定位开始】
- 将引用roots的对象写入重定位集
-
并发重定位,在重定位集中
gc cycle.png
Heap Regions
- 动态创建/销毁
- 动态创建大小为2MB的倍数(x86_64)
- 大小选择
- Small(2MB)
- Medium(32MB)
- Large(N*2MB)
有色指针
- 有色指针是zgc的核心设计理念
- 元数据:存储在64位指针的未使用位中
- 不支持32位平台
- 不支持压缩操作
- 虚拟地址掩码:硬件,操作系统,软件都支持
- 在Linux / x86_64上进行堆多映射
- 支持Solaris / SPARC的硬件
![](https://img.haomeiwen.com/i10870103/8f23e0868423206e.png)
Load Barrier
1.从堆上加载对象引用时,不是以后使用该引用访问对象的时候
Object o = obj.fieldA;
<load barrier needed here>
Object p = o; // No barrier, not a load from heap
o.doSomething(); // No barrier, not a load from heap
int i = obj.fieldB; // No barrier, not an object reference
2.如果指针上的颜色是bad color(mark/relocate/remap),则修复它(repair/heal)
3.针对常见情况进行了优化
条形标记
- 将堆分成多个逻辑域
-
每个gc线程对应负责一个或多个逻辑条状域
条状标记.png
gclog
![](https://img.haomeiwen.com/i10870103/5c0d0bdcf0144904.png)
![](https://img.haomeiwen.com/i10870103/235f3b59b55a203b.png)
参考文章:ZGC--Low-Latency-GC
觉得不错的文章,分享下:https://houbb.github.io/2018/11/28/java-gc-optimize
网友评论