1.简介
ZGC(The Z Garbage Collector)是JDK 11中推出的一款追求极致低延迟的实验性质的垃圾收集器,不管是物理上还是逻辑上,在ZGC中已经不存在新老年代的概念了
1.1缺点:
1. 用JDK8以上的就不多,够用了是关键
2. 对于内存架构要求高
3. 在JDK15之前处于实验阶段
4.在JDK11只能在64位的linux上使用,目前用得还比较少
1.2优点:
1)可以达到10ms以内的停顿时间要求
2)支持TB级别的内存(支持8MB~4TB级别的堆,JDK15以后支持16TB)
3)停顿时间不会随着堆的大小,或者活跃对象的大小而增加;堆内存变大后停顿时间还是在10ms以内
4)会分为一个个page,当进行GC操作时会对page进行压缩,因此没有碎片问题
1.3整理过程
实际上:
ZGC诞生于JDK11,经过不断的完善,JDK15中的ZGC已经不再是实验性质的了。
从只支持Linux/x64,到现在支持多平台;从不支持指针压缩,到支持压缩类指针…
在JDK16,ZGC将支持并发线程栈扫描(Concurrent Thread Stack Scanning),根据SPECjbb2015测试结果,实现并发线程栈扫描之后,ZGC的STW时间又能降低一个数量级,停顿时间将进入毫秒时代。
SPECjbb: SPECjbb 是这几个字母的首字母组成的,Standard Performance Evaluation Corporation(spec公司),JAVA server Business Benchmark(java服务器业务测试工具)。
在SPECjbb 这个基准测试中,被测产品要运行JVM,模拟一家全球大型零售企业的各种终端销售点请求、在线购买、数据挖掘等日常业务,通过不断增加的业务量来测试系统能够处理的最大值,同时会测试随着业务量增加,系统响应时间的变化,以全面评估运行各项Java业务应用的服务器性能水平。
SPECjbb 模拟了三层客户/服务器模型结构:第一层是用户(客户端输入);第二层是商业应用逻辑;第三层是数据库。
2.ZGC三大核心技术
2.1多重映射
为了能更好的理解ZGC的内存管理,我们先看一下这个例子:
你在你爸爸妈妈眼中是儿子,在你女朋友眼中是男朋友。在全世界人面前就是最帅的人。你还有一个名字,但名字也只是你的一个代号,并不是你本人。将这个关系画一张映射图表示:
2.1.1ZGC的内存管理。
ZGC为了能高效、灵活地管理内存,实现了两级内存管理:虚拟内存和物理内存,并且实现了物理内存和虚拟内存的映射关系。这和操作系统中虚拟地址和物理地址设计思路基本一致。
当应用程序创建对象时,首先在堆空间申请一个虚拟地址,ZGC同时会为该对象在Marked0、Marked1和Remapped三个视图空间分别申请一个虚拟地址,且这三个虚拟地址对应同一个物理地址。