Java 的 ZGC(Z Garbage Collector)

ZGC(Z Garbage Collector) 是 Java 11 引入的一种低延迟垃圾回收器,旨在减少垃圾回收时的停顿时间,并能够在大规模堆内存的环境下提供可预测的低停顿时间。ZGC 是一个并发、并行的垃圾回收器,专为大内存(例如多 TB)的系统设计,并且采用了很多创新的技术以避免长时间的 STW(Stop-the-World)停顿。


1. ZGC 的设计目标

ZGC 的设计目标是减少垃圾回收时的停顿时间,尤其是对于大堆(大于 10GB 或 100GB)的应用程序。其特点包括:

  • 低停顿时间:ZGC 的停顿时间通常在毫秒级别,不管堆的大小如何。
  • 可扩展性:能够支持数 TB 的堆内存,适应大规模应用程序。
  • 并发收集:大部分的垃圾回收过程都是并发执行的,减少了 GC 过程中应用程序停顿的时间。

2. ZGC 的主要特点

2.1 分代收集(Region-based Memory Management)

  • ZGC 将堆内存划分为多个 Region,每个 Region 负责一小块内存区域。每个 Region 可能是 Eden、Survivor 或 Old。
  • ZGC 采用这种区域化的方式来灵活地管理堆内存,有助于更高效地进行垃圾回收。

2.2 并发标记和回收

  • 并发标记:标记阶段与应用线程并发执行,减少了停顿时间。应用程序线程和垃圾回收线程同时进行标记。
  • 并发整理(Relocation):ZGC 在回收过程中会对对象进行整理,即将存活对象移动到新的位置,但这也是与应用线程并行进行的,避免了长时间的 STW 停顿。

2.3 并发的垃圾回收过程

ZGC 的垃圾回收过程包括多个并发阶段:

  1. 初始标记(Initial Mark)

    • 这一阶段需要短暂的停顿时间(STW),主要标记根对象和直接可达的对象。
  2. 并发标记(Concurrent Mark)
    • 在这个阶段,ZGC 与应用线程并发进行,标记整个堆中的存活对象。
  3. 并发整理(Concurrent Relocation)
    • 将存活对象移动到空闲区域,整理内存,同时与应用线程并发执行。
  4. 并发清理(Concurrent Cleanup)
    • 清除垃圾对象的过程,继续并发执行。

2.4 低停顿时间

  • ZGC 最大的优势是其低停顿时间,尤其适用于需要低延迟和大堆内存的场景。即使在大堆内存的情况下,ZGC 也能保持每次垃圾回收的停顿时间在毫秒级别。

3. ZGC 的工作原理

3.1 堆内存的划分

  • ZGC 会将堆划分为多个大小相等的 Region,并且每个 Region 的大小可以动态调整。每个 Region 都可以包含不同种类的对象,如 Eden、Survivor 或 Old 区。
  • 对象的分配和回收都在这些小区域内进行,从而提高了内存管理的灵活性和效率。

3.2 指针压缩(Pointer Compression)

  • ZGC 使用指针压缩技术来减少内存占用。当对象被移动时,ZGC 会更新相关的指针,确保对象的引用是正确的,同时保持低停顿。

3.3 并发整理

  • 在整理阶段,ZGC 会并发地将存活对象从一个区域迁移到另一个区域。这一阶段与应用线程并行执行,不会造成应用线程停顿。

3.4 自适应调优

  • ZGC 通过自适应的方式来动态调节其工作负载和资源分配,确保垃圾回收的效率。比如,ZGC 会根据堆内存的使用情况来调整不同阶段的并发度。

4. ZGC 与其他垃圾回收器的对比

4.1 与 CMS 比较

  • CMS(Concurrent Mark-Sweep) 垃圾回收器也旨在减少停顿时间,但它的老年代清理效率较低,可能出现 Concurrent Mode Failure,导致 Full GC 停顿。
  • 相比之下,ZGC 通过并发的标记、整理和清理阶段,不仅减少了停顿时间,还避免了 Full GC 的风险。ZGC 更加适合于大堆内存的环境。

4.2 与 G1 比较

  • G1 是另一种低延迟的垃圾回收器,G1 也通过分代回收来控制停顿时间,但它的停顿时间可能会随着堆的增大而增加。
  • ZGC 提供了更低的停顿时间,并且能够支持更大的堆内存。在堆内存较大的情况下,ZGC 的表现比 G1 更好。

4.3 与 Serial GC 比较

  • Serial GC 是单线程的垃圾回收器,所有回收工作都会暂停应用线程。
  • ZGC 是并发的,不会因为垃圾回收而导致长时间的停顿,尤其在大堆内存的情况下,ZGC 远优于 Serial GC。

5. ZGC 的优缺点

优点:

  1. 低停顿时间:ZGC 在垃圾回收时能够保持非常低的停顿时间,适合对低延迟要求较高的应用。
  2. 支持大堆内存:能够支持堆内存从 10GB 到数 TB 的情况,特别适合大规模的企业应用。
  3. 并发标记与整理:大部分的垃圾回收过程都与应用线程并发执行,避免了长时间的停顿。

缺点:

  1. 较高的内存开销:由于采用了指针压缩等技术,ZGC 可能需要更多的内存来存储对象的引用。
  2. 实现复杂:ZGC 的实现比 G1 和 CMS 更为复杂,因此需要更多的调优和维护。

6. 总结

ZGC(Z Garbage Collector)是一个低停顿、可扩展的垃圾回收器,专为大堆内存和对低延迟要求高的应用场景设计。它通过并发标记、整理和清理阶段,减少了垃圾回收时的停顿时间,适合大规模堆内存应用。ZGC 采用了区域化堆管理、指针压缩以及并发整理等技术,确保在大堆内存下的高效垃圾回收。

ZGC 的优点包括低停顿时间和支持大堆内存,但也存在内存开销较大、实现复杂的缺点。它是 Java 11 引入的创新垃圾回收器,适用于高要求的低延迟应用。

你了解 Java 的 ZGC(Z Garbage Collector)吗?的更多相关文章

  1. 提交并发量的方法:Java GC tuning :Garbage collector

    三色算法,高效率垃圾回收,jvm调优 Garbage collector:垃圾回收器 What garbage? 没有任何引用指向它的对象 JVM GC回收算法: 引用计数法(ReferenceCou ...

  2. java 11 ZGC(可伸缩,低延迟的gc)

    ZGC, A Scalable Low-Latency Garbage Collector(Experimental) 可伸缩,低延迟的gc ZGC, 这应该是JDK11最为瞩目的特性, 没有之一. ...

  3. [GC]一个简单的Garbage Collector的实现

    前言: 最近看了google的工程师写的一个非常简单的垃圾收集器,大概200多行C代码,感叹大牛总能够把复杂的东西通过很简单的语言和代码表达出来.为了增加自己的理解,决定把大牛的想法和代码分析一遍,与 ...

  4. 一个简单的Garbage Collector的实现

    一个简单的Garbage Collector的实现 前言: 最近看了google的工程师写的一个非常简单的垃圾收集器,大概200多行C代码,感叹大牛总能够把复杂的东西通过很简单的语言和代码表达出来.为 ...

  5. c++ [wrong]simple "Garbage Collector"

    In fact, Ptr alone can accomplish the task mentioned below. Implementation see Ptr.h, main2.cpp. In ...

  6. Getting Started with the G1 Garbage Collector(译)

    原文链接:Getting Started with the G1 Garbage Collector 概述 目的 这篇教程包含了G1垃圾收集器使用和它如何与HotSpot JVM配合使用的基本知识.你 ...

  7. AGC027 B - Garbage Collector 枚举/贪心

    目录 题目链接 题解 代码 题目链接 AGC027 B - Garbage Collector 题解 对于一组选取组的最优方案为,走到一点,然后顺着路径往回取点 设选取点坐标升序为{a,b,c,d} ...

  8. New Garbage Collector http://wiki.luajit.org/New-Garbage-Collector

    New Garbage Collector http://wiki.luajit.org/New-Garbage-Collector GC Algorithms This is a short ove ...

  9. agc 027 B - Garbage Collector

    B - Garbage Collector https://agc027.contest.atcoder.jp/tasks/agc027_b 题意: x坐标轴上n个垃圾,有一个机器人在从原点,要清扫垃 ...

  10. Erlang Garbage Collector

    Erlang Garbage Collector | Erlang Solution blog https://www.erlang-solutions.com/blog/erlang-garbage ...

随机推荐

  1. 一镜到底,通过Llama大模型架构图看透transformers原理

    一镜到底,通过Llama大模型架构图看透transformers原理 Llama Nuts and Bolts是Github上使用Go语言从零重写Llama3.1 8B-Instruct模型推理过程( ...

  2. 将文件转换为文件流进行上传(例:通过HDMI进行传输)

    package com.boottest.app; import org.apache.commons.codec.Charsets; import org.apache.http.HttpEntit ...

  3. Project Euler 457 题解

    初等数论小题目 求 \[n^2-3n-1\equiv 0\pmod {p^2} \] 配方,得到: \[(2n-3)^2\equiv 13 \pmod {p^2} \] 根据亨泽尔引理,只需得到 \( ...

  4. Flink11--FliterAndKeyBy算子

    一.导入依赖 参考本人下博客 二.代码 FLink11FilterApp.java package net.xdclass.class9; import org.apache.flink.api.co ...

  5. C# Winform 当音频播放完成后,播放下一个音频,怎么知道音频有没有播放完成

    程序在预警时,会发出报警音,当报警音频播放时间,超过预警频率时,就会像我们打印文档一样,像打印机发送10次打印任务.当打出第1张纸的时候,这时候想取消打印.就不能在电脑端通过软件操作了.因此为了避免这 ...

  6. 从0搭建Vue3组件库(一): 开篇

    前言 这是从0搭建Vue3组件库系列文章第一篇文章,这个系列我曾经写过多篇文章,但是写完之后回过头来再看里面有很多遗漏以及不足之处,所以决定重新梳理这个系列,并从头开始搭建一个完整的Vue3组件库工程 ...

  7. [BZOJ3514] [Codechef MARCH14] GERALD07加强版 题解

    名字感觉挺奇怪的. 考虑离线算法.首先答案就是用 \(n\) 减去连完边后的生成树森林边数.生成树当然就可以用 \(lct\) 求解了.我是不会告诉你这个时候我已经开始想回滚莫队了的. 考虑当我们倒序 ...

  8. [TJOI2019] 甲苯先生的字符串 题解

    有点水了-- 考虑相邻的不能放在一起,不相邻的可以,那么很容易想到转移方程: \[dp_{i,j}=\sum_{k=0}^{25}dp_{i-1,k}[j,k不相邻] \] 其中 \(dp_{i,j} ...

  9. vue - [01] 概述

    题记部分 001 || 什么是Vue   Vue(发音为 /vju:/,类似view)是一款用于构建用户界面的渐进式框架(JavaScript).它基于标准HTML.CSS和JavaScript构建, ...

  10. ETL工程师

    Python Flume DataX HDFS 数仓建模分层:ODS.DIM.DWD.DWS.APS Kettle.Informatica SQL(Oracle.MySQL)