ZGC是从JDK11中引入的一种新的支持弹性伸缩和低延迟垃圾收集器,ZGC能够工做在KB~TB的内存之下,做为一种并发的垃圾收集器,ZGC保证应用延迟不会超过10毫秒(即使在堆内存很大的状况下),在JDK11中是以实验阶段的特性被发布出来的,到JDK13时,ZGC能够支持到16TB的堆内存,而且能够将未提交的内存归还给操做系统。html
JVM的自动垃圾收集虽然减小了开发人员的工做,在必定程度上减小了内存泄漏的风险,可是因为GC是自动进行的,一些没法预知的事情有时候可能产生对应用有害的影响。java
随着时代发展,硬件会逐渐便宜,应用使用的内存将会愈来愈大,可是又不能增长延迟,下降吞吐量node
ZGC保证,无论在什么状况下,延迟不会超过10毫秒。bash
The Z Garbage Collector, also known as ZGC, is a scalable low latency garbage collector designed to meet the following goals:并发
- Pause times do not exceed 10ms
- Pause times do not increase with the heap or live-set size
- Handle heaps ranging from a few hundred megabytes to multi terabytes in size
ZGC最典型的特性是它是一款并发(concurrent)的GC,其它的特性以下:oracle
store barriers
,ZGC使用load barriers
,用于跟踪内存
ZGC支持的平台:jvm
平台 | 是否支持 | 当前进度 |
---|---|---|
Linux/x64 | Y | Since JDK 11 |
Linux/AArch64 | Y | Since JDK 13 |
macOS | In Progress | |
Windows | In Progress |
几个术语:性能
ZGC引入了两个新的概念,pointer coloring和load barriers.ui
这个特性让ZGC可以发现,标记,定位和从新映射对象,它只能工做在64位的操做系统上,实现colored pointer须要虚拟地址(virtual address masking)。spa
load barrier是一段代码,当线程从堆中加载引用的时候被运行。例如,当咱们访问对象的一个非主要类型的属性。
在ZGC中,load barrier检查引用的元数据位,根据元数据位对引用的对象作一些处理,所以可能在咱们获取对象的时候对象的引用会被修改掉,可是不影响咱们的使用。
能够从jdk官网下载最新版本的JDK,下载地址:
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成为一款更加优越的垃圾收集器吧。