面试 JVM 八股文十问十答第八期

面试 JVM 八股文十问十答第八期

码农世界 2024-05-19 后端 59 次浏览 0个评论

面试 JVM 八股文十问十答第八期

作者:程序员小白条,个人博客

相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新!

⭐点赞⭐收藏⭐不迷路!⭐

1) 了解TLAB吗?来谈谈吧

TLAB(Thread-Local Allocation Buffer)是一种Java虚拟机(JVM)内存分配优化技术。它旨在提高多线程应用程序的内存分配性能。

TLAB的基本思想是为每个线程分配一个私有的内存缓冲区。这个缓冲区在线程的堆栈上分配,因此每个线程都可以在自己的TLAB上进行快速的内存分配操作,而无需频繁地竞争全局的堆内存分配锁。这种方式减少了线程间的竞争,提高了内存分配的并发性能。

TLAB的大小通常是根据应用程序的需求和性能特性进行调优的。当线程的TLAB空间用尽时,它会重新申请一个新的TLAB或者尝试从全局的堆内存中分配内存。

TLAB的使用可以减少内存分配时的锁竞争,提高了多线程应用程序的性能和可伸缩性。

2) PLAB 是什么?

PLAB(Parallel Allocation Buffers)是G1垃圾收集器中的一种内存分配优化技术。

在G1垃圾收集器中,每个分区都有一个PLAB。当对象在垃圾收集期间被分配时,它们可以直接在PLAB中进行分配,而无需竞争全局的内存分配锁。这种方式减少了垃圾收集器的停顿时间,提高了吞吐量和并发性能。

PLAB的大小通常是根据应用程序的需求和性能特性进行调优的。它们的大小对于垃圾收集器的性能有很大影响,因此需要根据具体情况进行合理的设置和调整。

3) 产生 concurrent mode failure 真正的原因

"Concurrent mode failure"是在使用CMS(Concurrent Mark-Sweep)垃圾收集器时经常会遇到的一种错误。它表示在并发标记阶段中,由于老年代的空间不足而导致的一种失败情况。

其主要原因包括:

  • 老年代空间不足:CMS垃圾收集器在并发标记阶段,不会暂停应用程序线程,因此可能会在标记阶段结束后,老年代的空间不足以容纳新的对象。这时,CMS会触发一次Full GC,这会导致较长的停顿时间。
  • 并发阶段持续时间过长:如果并发标记阶段的持续时间过长,导致老年代中的对象持续增长,可能会导致老年代空间不足,触发concurrent mode failure。
  • 内存碎片问题:CMS垃圾收集器在收集时不会进行整理,可能会导致内存碎片问题,进而影响到老年代对象的分配。

    解决这个问题的方法包括增加老年代的空间、调整CMS的参数以减少并发阶段的持续时间,或者考虑使用其他垃圾收集器来避免这个问题。

    4) CMS GC 发生 concurrent mode failure 时的 full GC 为什么是单线程的?

    当CMS垃圾收集器发生concurrent mode failure时,它会触发一次Full GC以尝试解决老年代空间不足的问题。而这次Full GC通常是单线程执行的,原因如下:

    • 稳定性和可控性:在Java虚拟机中,Full GC通常会导致较长的停顿时间,因此采用单线程执行可以更好地控制和管理这个过程,避免出现并发问题或竞态条件。
    • 简化实现:使用单线程执行Full GC可以简化实现,减少并发情况下的复杂性。这样可以降低出错的可能性,并且更容易保证Full GC的正确性和稳定性。
    • 保证可达性分析的准确性:Full GC通常需要进行整个堆的可达性分析,而单线程执行可以更容易保证分析的准确性,避免因为并发情况下对象状态的变化而导致分析错误。

      虽然单线程执行Full GC可能会导致更长的停顿时间,但这种方式可以提高Full GC的稳定性和可控性,从而更好地保证系统的可靠性和性能。

      5) 为什么有些新老年代的收集器不能组合使用比如 ParNew 和 Parallel Old?

      ParNew是一种用于新生代的并行垃圾收集器,而Parallel Old是一种用于老年代的并行垃圾收集器。虽然它们都是并行的收集器,但不能直接组合使用的原因主要是:

      • 并发度不匹配:ParNew收集器是为了与CMS收集器配合使用而设计的,并且它与CMS的并发标记阶段相匹配。而Parallel Old收集器则是为了在Full GC时对老年代进行并行收集而设计的。由于CMS和Parallel Old都是针对老年代的,并且都是并行的收集器,因此它们之间可以很好地配合使用。但ParNew收集器和Parallel Old收集器之间并没有直接的并发匹配关系,因此不能直接组合使用。
      • 功能重叠:ParNew和Parallel Old收集器在功能上有一定的重叠,都是针对不同代的并行垃圾收集器。直接将它们组合使用可能会导致冗余的工作或性能下降,因为它们都会尝试并行地收集同一部分堆内存。

        综上所述,虽然ParNew和Parallel Old都是并行收集器,但它们之间并没有直接的并发匹配关系,因此不能直接组合使用。

        6) 新生代的 GC 如何避免全堆扫描?

        新生代的垃圾收集器通常采用基于复制或标记-复制的方式进行垃圾回收,从而避免全堆扫描的需求。具体来说:

        • 复制算法:新生代的经典收集器(如Serial、ParNew、Parallel Scavenge)通常采用复制算法。它将新生代分为两个大小相等的区域:一个是存活对象的From区,另一个是空的To区。在垃圾回收时,它会将存活对象从From区复制到To区,然后清空From区。这样,只需要扫描From区中的存活对象,而不需要扫描整个堆。
        • 标记-复制算法:一些现代的新生代收集器(如G1收集器)采用标记-复制算法。它将新生代划分为多个小块(称为Region),并使用了类似于标记-清除的方式来标记和清理垃圾对象。然后,它会将存活对象从一个区域复制到另一个区域,以避免全堆扫描。

          通过这些方式,新生代的垃圾收集器可以在回收内存时避免对整个堆进行全堆扫描,从而提高了垃圾回收的效率和性能。

          7) CMS 的记忆集和 G1 的记忆集有什么不一样?

          • CMS(Concurrent Mark-Sweep)的记忆集:CMS使用了一个称为Card Table的数据结构来维护对象之间的引用关系。Card Table将堆内存划分为若干个大小固定的卡片(Card),每个卡片对应一块内存区域。当某个对象被修改时,CMS会标记相应的卡片为“脏”(Dirty),表示该卡片内的对象引用关系已经改变,需要进行重新扫描。这样,在下一次垃圾收集时,CMS可以只扫描“脏”卡片所对应的内存区域,而不需要对整个堆进行全面扫描。
          • G1(Garbage-First)的记忆集:G1也使用了类似的记忆集机制,但它引入了更灵活的数据结构。G1将整个堆分成若干个大小相等的区域(Region),并使用一个叫做Remembered Set的数据结构来维护区域之间的引用关系。Remembered Set记录了每个区域与其他区域之间的引用关系,当某个区域的对象发生变化时,G1会更新相应的Remembered Set,以便在下一次垃圾收集时可以快速定位到相关的对象。

            总的来说,CMS和G1都使用了记忆集来维护对象之间的引用关系,但在具体实现上有一些差异,主要体现在数据结构的设计和维护方式上。

            8) 为什么 G1 不维护年轻代到老年代的记忆集?

            G1垃圾收集器不需要显式维护年轻代到老年代的记忆集,主要基于以下几个原因:

            • 分代特性:G1垃圾收集器是一种分代收集器,但它对分代的边界并不像传统的分代收集器那样严格。它将整个堆分成若干个大小相等的区域(Region),而不是明确地区分年轻代和老年代。因此,在G1中,对象可能会在不同的区域之间移动,而不是像传统的分代收集器那样只在固定的年轻代和老年代之间移动。
            • 智能回收:G1通过智能地分析和优化,可以在堆中的任何区域进行垃圾收集,包括既包含年轻代对象又包含老年代对象的区域。因此,不需要显式维护年轻代到老年代的记忆集,G1可以在进行垃圾收集时动态地选择合适的区域进行收集。
            • Remembered Set的设计:G1使用Remembered Set来维护区域之间的引用关系,而不需要特别关注对象所处的代。Remembered Set记录了每个区域与其他区域之间的引用关系,而不管这些对象是属于年轻代还是老年代。这样,G1可以在收集时直接使用Remembered Set来定位到相关的对象,而无需显式维护年轻代到老年代的记忆集。

              因此,G1不维护年轻代到老年代的记忆集是基于其设计理念和实现方式的考量,以提高垃圾收集的效率和灵活性。

              9) CMS 和 G1 为了维持并发的正确性分别用了什么手段?

              • CMS(Concurrent Mark-Sweep)的并发标记和清除:CMS在垃圾收集过程中采用了并发标记和清除的策略,即在应用程序运行的同时,尽可能多地并发执行标记和清除阶段。通过使用并发标记和清除,CMS可以减少垃圾收集导致的停顿时间,提高了应用程序的响应性。为了维持并发的正确性,CMS使用了一些技术,如在标记阶段使用写屏障(Write Barrier)来保证标记的准确性,以及在清除阶段使用CAS(Compare and Swap)等原子操作来保证清除操作的正确性。
              • G1(Garbage-First)的并发标记和整理:与CMS类似,G1也采用了并发标记和整理的策略。它使用了一种叫做SATB(Snapshot-At-The-Beginning)的并发标记算法,在标记阶段使用了写屏障来记录对象的引用变化,以保证标记的准确性。在整理阶段,G1会尽可能地并发执行堆内存的整理操作,以减少停顿时间。为了维持并发的正确性,G1使用了一些技术,如在标记和整理阶段使用写屏障来记录对象引用的变化,并在垃圾收集过程中保持堆的一致性。

                10) 什么是 logging write barrier?

                logging write barrier(日志写屏障)是一种垃圾收集器中常用的技术,用于跟踪对象之间的引用关系的变化。它主要用于并发标记-整理(Concurrent Mark-Sweep)和增量标记(Incremental Marking)等垃圾

                开源项目地址:https://gitee.com/falle22222n-leaves/vue_-book-manage-system

                前后端总计已经 1300+ Star,2W+ 访问!

                ⭐点赞⭐收藏⭐不迷路!⭐

转载请注明来自码农世界,本文标题:《面试 JVM 八股文十问十答第八期》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,59人围观)参与讨论

还没有评论,来说两句吧...

Top