ZGC是从JDK11中引入的一种新的 支持弹性伸缩 和 低延迟 垃圾收集器,ZGC可以工作在KB~TB的内存之下,作为一种并发的垃圾收集器,ZGC保证应用延迟不会超过10毫秒(即便在堆内存很大的情况下),在JDK11中是以实验阶段的特性被发布出来的,到JDK13时,ZGC可以支持到16TB的堆内存,并且可以将 未提交的内存归还给操作系统 。
JVM的自动垃圾收集虽然减少了开发人员的工作,在一定程度上减少了内存泄漏的风险,但是由于GC是自动进行的,一些无法预知的事情有时候可能产生对应用有害的影响。
随着时代发展,硬件会逐渐便宜,应用使用的内存将会越来越大,但是又不能增加延迟,降低吞吐量
ZGC保证,不管在什么情况下,延迟不会超过10毫秒。
The Z Garbage Collector, also known as ZGC , is a scalable low latency garbage collector designed to meet the following goals:
ZGC最典型的特性是它是一款 并发(concurrent)的GC ,其它的特性如下:
store barriers
,ZGC使用 load barriers
,用于跟踪内存
ZGC支持的平台:
平台 | 是否支持 | 当前进度 |
---|---|---|
Linux/x64 | Y | Since JDK 11 |
Linux/AArch64 | Y | Since JDK 13 |
macOS | In Progress | |
Windows | In Progress |
几个术语:
ZGC引入了两个新的概念, pointer coloring 和 load barriers.
这个特性让ZGC能够发现,标记,定位和重新映射对象,它只能工作在64位的操作系统上,实现colored pointer需要虚拟地址(virtual address masking)。
load barrier是一段代码,当线程从堆中加载引用的时候被运行。例如,当我们访问对象的一个非主要类型的属性。
在ZGC中,load barrier检查引用的元数据位,根据元数据位对引用的对象做一些处理,因此可能在我们获取对象的时候对象的引用会被修改掉,但是不影响我们的使用。
可以从jdk官网下载最新版本的JDK,下载地址:
www.oracle.com/technetwork…
GC日志标记格式如下:
-Xlog:<tag set>,[<tag set>, ...]:<log file> 复制代码
只是想要查看ZGC是否生效:
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xmx<size> -Xlog:gc 复制代码
想要查看更加详细的ZGC日志信息:
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xmx<size> -Xlog:gc* 复制代码
将更详细的日志信息记录在文件中:
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xmx<size> -Xlog:gc*:gc.log 复制代码
通用GC选项 | ZGC选项 | ZGC 诊断选项-XX:+UnlockDiagnosticVMOptions |
---|---|---|
-XX:MinHeapSize, -Xms -XX:InitialHeapSize, -Xms -XX:MaxHeapSize, -Xmx -XX:SoftMaxHeapSize -XX:SoftRefLRUPolicyMSPerMB | -XX:ZAllocationSpikeTolerance -XX:ZCollectionInterval -XX:ZFragmentationLimit -XX:ZMarkStackSpaceLimit -XX:ZPath -XX:ZUncommit -XX:ZUncommitDelay | -XX:ZProactive -XX:ZStatisticsInterval -XX:ZVerifyForwarding -XX:ZVerifyMarking -XX:ZVerifyObjects -XX:ZVerifyRoots -XX:ZVerifyViews |
是否启用NUMA支持:
# 启用NUMA -XX:+UseNUMA # 停用NUMA -XX:-UseNUMA 复制代码
调整并发的线程数:
-XX:ConcGCThreads= 复制代码
返回未提交的内存到操作系统,堆内存不会地址设置的最小堆内存-Xms
# 多久未提交的内存会返回给系统 -XX:+ZUncommit -XX:ZUncommitDelay=<seconds> 复制代码
开启大分页,一般会带来更好的性能提升,吞吐量,延迟和启动时间都有所改善。并没有看到明显的缺点
# 配置操作系统中的分页池数量 echo 9216 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages # 查看系统中现在的分页数量 cat /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages -XX:+UseLargePages 复制代码
mkdir /hugepages mount -t hugetlbfs -o uid=123 nodev /hugepages java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xms16G -Xmx16G -XX:+UseLargePages 复制代码
开启透明分页,透明分页可能导致延迟上的一些问题,有时候不推荐使用,开启透明分页需要 Linux kernel < 4.7
# 开启透明分页 echo madvise > /sys/kernel/mm/transparent_hugepage/enabled echo advise > /sys/kernel/mm/transparent_hugepage/shmem_enabled -XX:+UseTransparentHugePage 复制代码
ZGC仍然是处于试验特性阶段,但其保证延迟时间不低于10ms的特性,以及当前对堆内存大小的支持力度,还是值得一试,让我们期待ZGC成为一款更加优越的垃圾收集器吧。