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

这篇具有很好参考价值的文章主要介绍了《面试1v1》G1垃圾回收器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我是 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》G1垃圾回收器

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


《面试1v1》 连载中…


🎁目录合集:

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

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

http://javapub.net.cn文章来源地址https://www.toymoban.com/news/detail-475440.html

到了这里,关于《面试1v1》G1垃圾回收器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java八股文面试[JVM]——垃圾回收器

    jvm结构总结   常见的垃圾回收器有哪些?     CMS(Concurrent Mark Sweep) 整堆收集器 : G1 由于整个过程中 耗时最长 的 并发标记 和 并发清除 过程中,收集器线程都可以与用户线程一起工作,所以 总体上来说 ,CMS收集器的内存回收过程是与用户线程一起并发地执行。老年代收

    2024年02月11日
    浏览(47)
  • 【面试精讲】Java有哪些垃圾回收器?工作原理都是什么?它们有什么区别?

    【面试精讲】Java有哪些垃圾回收器?工作原理都是什么?它们有什么区别? 目录 本文导读 一、垃圾回收器概览 Serial GC工作原理概览 Parallel GC工作原理概览 CMS回收器工作原理概览 G1回收器工作原理概览 2、选择适合的垃圾回收器 二、串行垃圾回收器(Serial GC) 工作原理 工

    2024年04月16日
    浏览(36)
  • JVM——垃圾回收(垃圾回收算法+分代垃圾回收+垃圾回收器)

    只要一个对象被其他对象所引用,就要让该对象的技术加1,某个对象不再引用其,则让它计数减1。当计数变为0时就可以作为垃圾被回收。 有一个弊端叫做循环引用,两个的引用计数都是1,导致不能作为垃圾回收,会造成内存泄露。 java虚拟机没有采用该算法。 该算法需要

    2024年02月12日
    浏览(50)
  • 垃圾回收器

    垃圾回收器就是垃圾回收的实践者,随着JDK的发展,垃圾回收器也在不断的更迭,在不同的场合下使用不同的垃圾回收器,这也是JVM调优的一部分。 按线程可分为单线程(串行)垃圾回收器和多线程(并行)垃圾回收器。 按工作模式可分为独占式和并发式垃圾回收器。 按工作的区

    2024年02月11日
    浏览(40)
  • 【JVM】13. 垃圾回收器

    2023年05月29日
    浏览(39)
  • 常见的垃圾回收器(上)

    常见的垃圾回收器(下) Serial垃圾回收器 + SerialOld垃圾回收器 Serial是一种单线程串行回收年轻代的垃圾回收器 回收年代和算法 年轻代:复制算法 老年代:标记-整理算法 优点 单CPU处理器下吞吐量非常出色 缺点 多CPU下吞吐量不如其他垃圾回收器,堆如果偏大会让用户线程处

    2024年04月14日
    浏览(37)
  • JVM之垃圾回收器

    垃圾回收常见面试题: 如何判断对象是否死亡。 简单的介绍一下强引用、软引用、弱引用、虚引用。虚引用与软引用和弱引用的区别、使用软引用能带来的好处 如何判断一个常量是废弃常量 如何判断一个类是无用的类 垃圾收集有哪些算法,各自的特点? HotSpot 为什么要分

    2024年02月14日
    浏览(43)
  • JVM的组件、自动垃圾回收的工作原理、分代垃圾回收过程、可用的垃圾回收器类型

    https://www.processon.com/diagraming/64c8aa11c07d99075d934311 https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html 年轻代是所有新对象被分配和老化的地方。当年轻代填满时,这会导致minor garbage collection,minor gc会回收掉很多的游离对象。游离的年轻代很快就被收集起来。一些幸存的

    2024年02月14日
    浏览(48)
  • 深入解析CMS垃圾回收器

    本文已收录至GitHub,推荐阅读 👉 Java随想录 微信公众号:Java随想录 原创不易,注重版权。转载请注明原作者和原文链接 目录 CMS简介 运作过程 初始标记 并发标记 并发预处理 可取消的并发预处理 重新标记 并发清除 CMS的缺陷 处理器资源敏感 无法处理“浮动垃圾” 内存碎

    2024年02月11日
    浏览(44)
  • JVM常见的垃圾回收器(详细)

    1、Young为年轻代出发的垃圾回收器。 2、Old为老触发的垃圾回收器。 3、连线代表的是垃圾回收器的组合。CMS 和Serial Old连线代表CMS一旦不行了,Serial Old上场。 1、什么是STW? STW是Stop-The-World缩写: 是在垃圾回收算法执⾏过程当中,将JVM内存冻结丶应用程序停顿的⼀种状态。

    2024年02月08日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包