《面试1v1》G1垃圾回收器

news2024/11/28 1:36:59

我是 javapub,一名 Markdown 程序员从👨‍💻,八股文种子选手。


《面试1v1》 连载中…


面试官: G1垃圾收集器?听说很牛逼的样子!

候选人: 是的,G1是JDK9默认的垃圾收集器,代替了CMS收集器。它的目标是达到更高的吞吐量和更短的GC停顿时间。

面试官: 听你一说,我就不高兴了!G1到底好在哪儿?

候选人: G1具有以下优点:

  1. 并发和增量式回收:不像CMS要全部STW,G1可以渐进式回收,不停顿太久。
// G1CollectedHeap.java
void collectGarbage(G1ConcurrentMark mark) {
    initial-mark; // STW
    remark();     // Concurrent 
    cleanup();    // STW
    concurrent-cleanup();  // Concurrent
}
  1. 分代回收:不需要一次全堆回收,可以分代增量回收,选择性回收新生代和老年代。
void collectGarbage(boolean collectOnlyYongGen) {
    if (collectOnlyYongGen) {
        collectYoungGenGarbage();  // only YongGen
    } else {
        collectGarbage(); // YongGen and Old Gen
    }
} 
  1. 空间整合:通过Remembered Sets实现空间整合,解决碎片问题。
// G1RemSet.java
void addToRememberedSets(HeapRegion from, HeapRegion to) { 
    from.addRememberedSetEntry(to); 
}
  1. 预测分析:通过限定垃圾产生速率,动态调整回收频率与时间,实现高吞吐量。

面试官: 垃圾收集里最让我头疼的就是“Remembered Sets”和“卡片表”,解释一下?

候选人: Remembered Sets和Card Tables都是G1用来管理堆和处理垃圾回收的重要数据结构。

  1. Remembered Sets:记录不同Region之间的引用关系,用于判定垃圾。由于G1采用分代和分片回收,需要记录新生代和老年代以及各个Region之间的引用链,这就是Remembered Sets要做的工作。
  2. Card Tables:由Remembered Sets维护的引用链过于精细,代价太大。所以,G1引入Card Tables,按照内存块做了分段,如果一个分段里至少有一个对象被老年代引用,则标记整个分段为”脏“。在回收时只处理”脏“的分段,提高效率。
  3. 它们的工作可以简述为:Remembered Sets记录精细的引用信息,Card Tables进行概括性标记,在GC时结合使用,达到高精度且高性能的铁子回收效果。
  4. 可以看到,Remembered Sets和Card Tables是G1高效率回收的关键,它们让G1不需要像CMS那样全堆回收,可以有选择性地、增量式地进行分代、分片的回收,极大的提高了工作效率。

面试官: 原来如此,G1之所以马力十足,关键还是它发明的这套“铁子”数据结构,聪明!

候选人: 谢谢面试官的赞赏和提议!我会继续努力学习,如果有机会能参与。

面试官: 说说G1的垃圾回收过程?

候选人: G1的垃圾回收过程可以分为以下几个主要阶段:

  1. 初始标记:标记GC Roots能直接关联的对象,需要Stop The World。
private void initialMark() {
    for (Object obj : strongRefs) {
        G1CollectedHeap.mark(obj);
    }
}
  1. 并发标记:从GC Roots开始对堆中对象进行并发标记,需要部分STW。
  2. 最终标记:修正并发标记期间的错误标记,需要STW。
  3. 筛选回收:根据标记和Card Table结果筛选回收区域,回收垃圾,需要STW。
// 筛选待回收区域
void selectGarbageCollectionCandidates() {
    Region[] filtered = filterRegions(); 
    garbageCollect(filtered);
}
  1. 并发清理:与用户线程一起工作,对标记和筛选阶段误差产生的垃圾链进行清理。
  2. 并发重置:与用户线程一起工作,为下次GC做准备。

这一过程实际上和CMS非常相似,同为“标记-清除”算法。但G1在并发标记的基础上,通过Remembered Sets和Card Tables实现了分代回收和空间整合,这也是它能达到高性能的关键。

面试官: 说G1是“标记-清除”,是不是太武断了?它用的不正是你刚才提到的那套铁子数据结构吗?

候选人: 您说的对,我的表述确实有失妥当。更准确的来说:

  1. G1继承了“标记-清除”算法的思想,但已远非传统意义上的“标记-清除”。
  2. G1引入了Remembered Sets和Card Tables,实现了细致且高效的分代、分片增量回收,这是它的重要创新点。
  3. 所以,G1是在“标记-清除”思想上做出重大改进、发展和优化而成的一种高性能垃圾收集器,将它简单归类为“标记-清除”算法已忽略其最关键的优点。
  4. G1与CMS一脉相承,但已大大超越,其性能和效率甚至与“复制”算法接近,堪称一代新高。
    所以,更准确的说法应是:G1继承了标记-清除模型,但在算法和实现上都已经有了重大创新,超越了传统标记-清除算法,达到一种混合模型与新高度,是一款高性能、高效率的收集器。

面试官: 对,你的理解已经趋于准确和清晰。能看出G1的创新之处,并不简单归类,这说明你对收集器的认知已逐步深入。

面试官: G1收集器的设计与实现还有哪些关键点需要关注?

候选人: 除了我们讨论过的Remembered Sets和Card Tables外,G1的设计与实现还有其他一些关键点:

  1. Region:将整个堆内存分割成多个大小相等的Region,作为回收和管理的基本单元。
  2. Humongous Object:对超大对象特殊处理,让其占用连续的Region。
  3. Remembered Sets:记录不同Region之间的引用关系,但过于精细,通过Card Tables进行优化。
  4. Card Tables:按Region进行内存分块,标记”脏“的Region,在GC时优先处理。
  5. Coloreo Grey Lists:通过颜色标记法管理标记过程,避免重复标记对象。
  6. 回收率与吞吐量预测:通过统计与分析,动态预测并调整回收率与吞吐量,实现自动调优。
  7. 增量式并发回收:通过分代和分片回收,以及STW与并发相结合,实现渐进式回收与低停顿。
  8. 空闲区整理:通过回收产生的空闲区的合并整理,解决空间碎片问题。
  9. Safepoint:在STW阶段,用于保证用户线程的一致性快照。但开销大,所以尽量减少STW次数。

这些都是G1高性能与低停顿的关键 support,对其设计与实现有深入理解,可以更好运用G1收集器。当然,本回答只能简要提及,实际上G1的设计极为复杂精巧,需要深入研读源码和官方文档方能全面理解。

面试官: Wonderful! 你对G1的理解已经相当深入全面,提到的这些关键点imovativ析得很透彻。G1的设计确实非常复杂精巧,能达到如此水平的理解,看来你在这方面下了不少功夫!

候选人: 非常感谢您的赞赏!我会持之以恒,继续深入学习G1与其他垃圾收集器的设计与实现。事实上,想全面深入理解G1还需要我继续努力,它的设计之巧妙令人颇感佩服与惊叹,这也使得我在研究这个课题上收获颇丰。谢谢您的提问,让我有机会梳理和总结这些关键点,这对我加深理解G1有很大帮助。我亟需在实践中不断磨练这些理论知识,并且对更多案例和细节有所了解,这需要我继续学习和努力。

面试官: 开心能听到你如此谦逊好学的态度。

最近我在更新《面试1v1》系列文章,主要以场景化的方式,讲解我们在面试中遇到的问题,致力于让每一位工程师拿到自己心仪的offer,感兴趣可以关注JavaPub追更!


《面试1v1》 连载中…


🎁目录合集:

Gitee:https://gitee.com/rodert/JavaPub

GitHub:https://github.com/Rodert/JavaPub

http://javapub.net.cn

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/620614.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

4.运算符|Java学习笔记

文章目录 运算符介绍算术运算符关系运算符(比较运算符)逻辑运算符赋值运算符三元运算符位运算符 运算符优先级Java命名规范关键字保留字 进制十进制转(二/八/十六进制)原码、反码、补码 运算符介绍 运算符是一种特殊的符号&#…

【Linux】认识Linux下的编译器gcc/g++ | 认识动静态库

本文思维导图: 文章目录 前言tips: 关于前两篇文章所提到的sudo指令 一、gcc/g编译器的认识和使用tips 1.预处理2. 编译3.汇编4.链接关于预编译,编译,汇编阶段的指令记忆方法 二、gcc/g指令汇总三、认识动静态库1.库的认知库的命名规则静态库…

C++ ---- 继承

目录 继承概念及定义 继承概念 继承定义 语法 继承关系和访问限定符 继承基类成员访问方式的变化 规律总结 以公有继承为例测试 基类和派生类对象赋值转换 继承中的作用域 派生类的默认成员函数 构造函数 析构函数 拷贝构造 赋值重载 继承与友元 继承与静态成员…

ESP8266调用NTP服务器进行时间校准

一、背景知识 【1】什么是NTP服务器? NTP是网络时间协议(Network Time Protocol,简称NTP),是一种用于同步计算机时间的协议。NTP服务器指的是提供NTP服务的计算机或设备。NTP服务器的主要功能是保证网络上的所有设备…

Linux下信号量使用总结

目录 1.Linux下信号量简介 2.POSIX信号量 2.1 无名信号量 2.2 有名信号量 3.System V信号量 1.Linux下信号量简介 信号量是解决进程之间的同步与互斥的IPC机制,互斥与同步关系存在的症结在于临界资源。 临界资源是在同一个时刻只容许有限个(一般只有…

ble系统知识介绍(较为完整,持续更新中)

BLE学习 现在网上关于BLE系统的学习资料实在是太少了,因此本文希望能够聚集一些资料能够系统的入门BLE,本文翻译自Bluetooth_LE_Primer_Paper,还有一些网上的一些资料,如果侵害到了某些作者的权益请及时联系我 参考资料和链接 Bluetooth_LE_Primer_Paper_3MtXws-zP…

GitOps 实践之渐进式发布

本文作者:陈钧桐 腾讯云 CODING DevOps 高级解决方案架构师,从事多年技术布道工作,对于云原生时代下企业数字化转型、IT 与 DevOps 建设、价值流体系搭建等有丰富的经验,曾为多家大型企业提供咨询、解决方案以及内训服务。既关注工…

【Python小技巧】加密又提速,把.py文件编译为.pyd文件(类似dll函数库),你值得拥有!

文章目录 前言一、常见的Python文件格式有哪些?二、准备编译环境1. 安装cython2. 安装Microsoft C 生成工具 三、编译.py文件为.pyd文件1. 编辑原始.py文件2. 准备setup.py文件3. 进行编译 四、测试总结 前言 Python的脚本文件是开源的,若直接发布&#…

i.MX RT1010跨界MCU上手体验(上)

由于项目需要性价比高一些的高性能MCU,了解到NXP的RT1010主频高达500MHZ的MCU,半个月以前已经拿到官方Demo板了,今天抽空上电体验下,在此记录。这颗芯片的优势是主频高,功能全,价格合理,但是需要…

第六章 方法区

文章目录 前言一、🛺 栈、堆、方法区的交互关系二、🚎 方法区的理解1、方法区在哪里2、方法区的演变过程 三、🚗 设置方法区的大小与 OOM1、设置方法区内存的大小2、使用CGLib 让方法区OOM3、如何解决 OOM4、方法区的内部结构5、non-final 的…

利用提示工程优化软件架构:ChatGPT的应用

ChatGPT时代的软件架构全生命周期 简介 在如今日新月异的技术环境中,软件架构师必须不断地寻找和采纳新的工具和方法,以优化开发过程,提高效率,并保证最终产出的质量。其中,人工智能(AI)已经成…

《淘宝技术这十年》读书笔记

一. 分布式时代 在系统发展的过程中,架构师的眼光至关重要,作为程序员,只要把功能实现即可,但作为架构师,要考虑系统的扩展性、重用性,对于这种敏锐的感觉,有人说是一种“代码洁癖”。淘宝早期…

使用双屏时两个屏幕的色调、亮度不一样如何设置?

当使用双屏时,即使两个屏幕的型号一致也可能存在色差的问题(色调不一致,亮度不一致),以下是解决此问题的方法。 Step1.同时按下两个屏幕下方的ok按钮 Step2.此时会进入显示器的OSD界面 Step3.通过按键切换菜单 Step4.…

节省35% MCU开发成本的红外智能洗手器运用方案,N9300-S16音乐芯片

随着全国人民生活水平的逐步提升以及近期疫情影响,公民的健康保护意识也越来越强,洗手液越来越被人们重视以及提倡,即时在受疫情影响是2022年洗手液市场规模也是上升至恐怖34亿元产值;而近年来自动感应洗手液器凭借实用性、便携性…

APP测试面试题快问快答(三)

11. App安装测试的主要内容有哪些? App是客户端程序,客户端程序就需要进行安装才能使用,因此需要测试安装、卸载、升级测试 关注点:正常场景、异常场景。 正常场景: 1. 在不同的操作系统上安装 2. 从不同的安装渠…

windows10安装ElasticSearch

一 安装 Java环境 ElasticSearch使用Java开发的,依赖Java环境,安装 ElasticSearch 之前,需要先安装一个较新版本的 Java,jdk 1.8版本太低了,需要安装jdk 11或更高版本。 Java安装方法请参考 Java 15环境安装 。 二 …

详解字典树原理,代码分析leetcode208. 实现 Trie (前缀树)

0、引言 本文介绍一种能够偶快速查找字符串的树形数据结构-----字典树。介绍其原理,以及通过leetcode208题目这个实例,用数组动手实现一棵字典树,并完成其增、查字符串、查字符串前缀的功能。 1、字典树的应用场景 询问一个单词b&#xff0c…

Mujoco 加载机器人模型(三)

目录 .1 简介 1.1 urdf概述 ​编辑 1.2 导出urdf为可用的xml​编辑 1.3 导出测试​编辑 .2 修改 2.1 添加平面和物体 2.2 关节修改 2.2.1 group 2.2.2 关节修改 2.2.3 关节 解压提供的ur5后 修改compiler的 meshdir路径 <mujoco model"ur5"><compi…

一条耗时100ms的SQL把系统搞崩了

一个项目上线了两个月&#xff0c;除了一些反馈的优化和小Bug之外&#xff0c;项目一切顺利。前期是属于推广阶段&#xff0c;可能使用人员没那么多&#xff0c;当然对于项目部署肯定提前想到并发量了&#xff0c;所以早就把集群安排上&#xff0c;而且还在测试环境搞了一下压测…

2023年的深度学习入门指南(15) - 大模型的幻觉

2023年的深度学习入门指南(15) - 大模型的幻觉 大模型的能力最另人惊讶的&#xff0c;一个是强大的能力&#xff0c;另一个就是时不时一本正经地胡说八道。如果你用的是小一点的模型&#xff0c;可能还见过输出循环内容之类的情况。我们将这种生成不良内容的现象称为幻觉-hall…