首页 > 编程语言 >高级java每日一道面试题-2024年10月23日-JVM篇-说一下JVM有哪些垃圾回收算法?

高级java每日一道面试题-2024年10月23日-JVM篇-说一下JVM有哪些垃圾回收算法?

时间:2024-10-26 20:45:04浏览次数:11  
标签:10 面试题 标记 对象 回收 算法 垃圾 JVM 内存

如果有遗漏,评论区告诉我进行补充

面试官: 说一下JVM有哪些垃圾回收算法?

我回答:

在 Java 虚拟机 (JVM) 中,垃圾回收 (Garbage Collection, GC) 是一项非常重要的功能,用于自动管理应用程序的内存。JVM 采用多种垃圾回收算法来决定何时以及如何回收不再使用的对象所占用的内存。以下是几种常见的垃圾回收算法及其详细说明:

1. 标记-清除(Mark-Sweep)算法

  • 原理:这是最基本的垃圾回收算法,分为标记阶段和清除阶段。在标记阶段,垃圾回收器会遍历所有对象,并标记存活的对象。在清除阶段,垃圾回收器会清除未被标记的对象,并释放其内存。从根节点(如全局变量、本地变量等)开始遍历,标记所有可达的对象。
  • 优点:实现简单,不需要额外的内存空间。能够有效地回收不可达的对象。
  • 缺点:会产生大量不连续的内存碎片,可能导致空间浪费。同时,标记和清除两个过程都需要遍历所有对象,效率较低。需要暂停整个应用程序(Stop-The-World)。

2. 复制(Copying)算法

  • 原理:为了解决标记-清除算法中的内存碎片问题,复制算法将内存空间划分为两个相等的区域,每次只使用其中一个区域。当垃圾回收时,它将活动的对象复制到另一个区域,并清除当前区域的所有对象。
  • 优点:解决了内存碎片问题,且每次只需要复制存活的对象,复制成本相对较低。无需处理碎片化问题。回收速度快。
  • 缺点:需要两倍的内存空间,内存利用率较低。同时,如果存活对象较多,复制成本会相对较高。需要两倍的内存空间。只适用于新生代(Young Generation),因为新生代中的对象存活率较低。

3. 标记-压缩(Mark-Compact)算法

  • 原理:标记-压缩算法是在标记-清除算法的基础上进行优化,解决了内存碎片问题。它在标记和清除阶段之后,将存活的对象压缩到内存的一端,并直接清除边界以外的内存。
  • 优点:避免了内存碎片的问题,且不需要额外的内存空间。
  • 缺点:压缩过程需要额外的时间,可能会降低垃圾回收的效率。仍然需要暂停应用程序。移动对象可能会影响性能。

4. 分代收集(Generational)算法

  • 原理:分代收集算法是一种基于对象存活周期的垃圾回收算法。它将内存分为新生代和老生代两个区域。新生代通常包含大量新创建的对象,老生代包含长时间存活的对象。垃圾回收器根据不同代的特点采用不同的回收策略。新生代采用复制算法,老生代采用标记-压缩算法。
  • 优点:能够根据对象存活周期的不同,采用不同的回收策略,提高垃圾回收的效率。
  • 缺点:需要维护新生代和老生代的内存划分和回收策略,增加了垃圾回收器的复杂性。
新生代 (Young Generation)
  • 用于存放新创建的对象。
  • 采用复制算法。
  • 垃圾回收频率较高。
老年代 (Old Generation)
  • 用于存放经过多次垃圾回收后仍然存活的对象。
  • 采用标记-清除或标记-压缩算法。
  • 垃圾回收频率较低。
永久代 (Permanent Generation)
  • 用于存放类的元数据。
  • JDK 8 之后已经被 Metaspace 替代。

5. 分区(Region)算法

  • 原理:分区算法将内存划分为多个独立的区域,每个区域可以独立地进行垃圾回收。这种算法可以根据应用程序的特点定制回收策略,提高垃圾回收的灵活性。
  • 优点:提高了垃圾回收的灵活性,可以根据应用程序的特点定制回收策略。
  • 缺点:需要管理多个区域的内存分配和回收,增加了垃圾回收器的复杂性。同时,如果区域划分不合理,可能会导致内存碎片问题。

6. 引用计数(Reference Counting)算法

  • 原理:引用计数算法通过维护每个对象的引用计数来跟踪对象的生命周期。当一个对象被引用时,其引用计数加一;当引用失效时,引用计数减一。当引用计数为零时,表示对象不再被使用,可以被回收。
  • 优点:实现简单,能够实时回收垃圾对象。
  • 缺点:无法处理循环引用问题。如果两个对象相互引用,即使它们都不再被其他对象引用,它们的引用计数也不会为零,因此无法被回收, 需要额外的空间来存储计数器。增加了每次引用操作的开销。

7. 自适应混合回收(Adaptive Hybrid)算法

  • 原理:自适应混合回收算法是一种结合了分代收集和复制算法的垃圾回收策略。它根据不同代的存活对象比例动态调整回收策略。当新生代存活对象比例较高时,采用复制算法;当老生代存活对象比例较高时,采用标记-压缩算法。
  • 优点:能够根据应用程序的特点自适应地调整回收策略,提高垃圾回收的效率和准确性。
  • 缺点:需要动态调整回收策略,可能会增加垃圾回收器的复杂性。

8. 并发标记-清除 (Concurrent Mark-Sweep, CMS)

  • 原理:CMS 是一种试图减少垃圾回收时暂停时间的算法,通过并发的方式执行标记和清除过程。
  • 优点:减少了应用程序暂停的时间。提高了吞吐量。
  • 缺点:仍然存在碎片化问题。可能导致较大的暂停时间(Full GC)。

9. G1 (Garbage First)

  • 原理:G1 是一种新的垃圾回收器,设计用于替换 CMS,它将堆划分为多个大小相等的区域(Region),并在这些区域之间进行垃圾回收。
  • 优点:减少暂停时间。自动处理碎片化问题。支持更大的堆。
  • 优点:相对复杂。需要更多的元数据。

以上是 Java 虚拟机中常用的几种垃圾回收算法。每种算法都有自己的特点和适用场景。理解这些算法对于优化 Java 应用程序的性能非常重要。在实际应用中,JVM 会根据堆的大小、对象的存活率等因素选择最适合的垃圾回收策略。

标签:10,面试题,标记,对象,回收,算法,垃圾,JVM,内存
From: https://blog.csdn.net/qq_43071699/article/details/143242725

相关文章

  • Java 面试题【MySQL 篇 一】
    MySQL中的数据排序是怎么实现的?参考链接:MySQL中的数据排序是怎么实现的?-MySQL面试题-面试鸭-程序员求职面试刷题神器排序过程中,如果排序字段命中索引,则利用索引排序。反之,使用文件排序。文件排序中,如果数据量少则在内存中排序,具体是使用单路排序或者双路排序。......
  • 高等数学 7.10常系数线性微分方程组解法举例
    在研究某些实际问题时,会遇到由几个微分方程联立起来共同确定几个具有同一自变量的函数的情况。这些联立的微分方程称为微分方程组。如果微分方程组中的每一个微分方程都是常系数线性微分方程,那么,这种微分方程组就叫做常系数线性微分方程组。对于常系数线性微分方程组,我们可以用......
  • 2024-10-26:最长公共后缀查询。用go语言,给定两个字符串数组 wordsContainer 和 wordsQu
    2024-10-26:最长公共后缀查询。用go语言,给定两个字符串数组wordsContainer和wordsQuery,要对每个wordsQuery[i]找到一个与其有最长公共后缀的字符串。如果有多个字符串与wordsQuery[i]有相同的最长公共后缀,则返回在wordsContainer中最早出现的那个。最后,返回一个整数数组a......
  • CSSE2010/CSSE7201 VR Project
    CSSE2010/CSSE7201Semester22024VRProject1CSSE2010/CSSE7201AVRProjectSemester2,2024-Version1.01(06/10/2024)Due:4:00pm,Friday25thOctoberWeighting:20%(100marks)Clarificationsandchangessincetheinitialreleaseoftheprojectspecifica......
  • JVM:初识JVM
    目录一、什么是JVM?1、JVM的全称2、JVM的职责二、JVM的功能1、解释字节码文件(上面提到了)2、内存管理3、即时编译(Just-In-Time,简称JIT)三、常见的JVM1、常见的几种JVM2、HotSpot(OracleJDK版)的发展历程总结一、什么是JVM?1、JVM的全称JVM全称是JavaVirtualMac......
  • 面试 | Python热门面试题·基础篇
    Python简介Python由GuidovanRossum开发,于1991年2月20日首次发布。它是最广泛使用和最受欢迎的编程语言之一,本质上是解释性的,因此在合并动态语义方面提供了灵活性。它也是一种免费的开源语言,语法非常简单干净。这使开发人员可以轻松Python,Python还支持面向对象编程,......
  • 自学Python不知道看什么书?10本Python经典好书(附pdf),看完少走一半弯路
    前言Python的语法简单,易于上手,这使得初学者能够快速地掌握编程基础,并迅速投入到实际项目中去。同时Python入门时阅读书籍的作用是多方面的,阅读书籍不仅为初学者提供了系统学习Python的基础、掌握的基础知识,还可以培养他们的编程思维和学习动力,为未来的编程之路打下坚实的基础......
  • 《DNK210使用指南 -CanMV版 V1.0》第三十三章 image元素绘制实验
    第三十三章image元素绘制实验1)实验平台:正点原子DNK210开发板2)章节摘自【正点原子】DNK210使用指南-CanMV版V1.03)购买链接:https://detail.tmall.com/item.htm?&id=7828013987504)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/k210/ATK-DNK210.html5)......
  • 2024.10.23
    Java连接mysql数据库1.1流程java连接mysql大致需要这六步:导入驱动包:这里我使用的是mysql-connector-java-8.0.17.jar(点击下载),这个包连接mysql5.6,5.7,8.0版本都没问题。Class.forName("com.mysql.cj.jdbc.Driver");url和账户名密码JDBC连接串:jdbc:mysql://<地址>:<端口>/<......
  • Win11右键回退到Win10
    以管理员身份打开命令提示符(CMD)运行以下命令:点击查看代码reg.exeadd"HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32"/f/ve重启资源管理器或电脑。重启资源管理器命令:点击查看代码taskkill/f/imexplorer.exe&startexp......