【大白话说Java面试题 第55题】【JVM篇】第15题:JVM有哪些垃圾收集算法?

📌 PDF :大白话说Java面试题 --- 02-JVM篇

第15题:JVM有哪些垃圾收集算法

📚 回答:

  • 核心概念
    JVM 的垃圾收集算法是垃圾回收的核心机制,决定了如何高效地标记和回收内存中的垃圾对象。常见的垃圾收集算法包括以下三种:标记-复制标记-清除标记-整理

1. 标记-复制(Mark-Copy)算法
  • 定义

    • 将内存划分为两块区域(From 和 To),每次只使用其中一块。
    • 当一块区域的内存用完后,垃圾回收器会将存活对象复制到另一块区域,然后一次性清理掉已使用的空间。
  • 优点

    • 高效清理短生命周期的对象,避免内存碎片化问题。
  • 缺点

    • 需要额外的内存空间,导致内存利用率较低(通常只有 50%)。

    💡 适用场景

  • 年轻代中对象大多数是短生命周期的,适合使用标记-复制算法。


2. 标记-清除(Mark-Sweep)算法
  • 定义

    • 先标记所有存活对象,然后统一回收未标记的对象(即垃圾对象)。
  • 优点

    • 实现简单,适合一次性清理大量垃圾对象。
  • 缺点

    • 容易产生内存碎片,影响后续分配大对象的效率。

    💡 源码解析
    Serial OldParallel Old 收集器在老年代中使用了标记-整理算法,但基础原理与标记-清除类似。


3. 标记-整理(Mark-Compact)算法
  • 定义

    • 标记过程与标记-清除相同,不同的是标记完成后不会直接回收垃圾对象,而是将所有存活对象向一端移动,然后清理掉边界以外的空间。
  • 优点

    • 避免内存碎片化问题,适合频繁分配大对象的场景。
  • 缺点

    • 整理过程需要额外的时间开销,性能略低于标记-清除。

4. 总结对比
算法 适用场景 优点 缺点
标记-复制 年轻代(短生命周期对象) 高效清理垃圾,无内存碎片 需要额外的 Survivor 区,内存利用率低
标记-清除 老年代(少量垃圾对象) 实现简单,适合一次性清理大量垃圾 易产生内存碎片
标记-整理 老年代(频繁分配大对象) 避免内存碎片,适合长期运行的应用 整理过程耗时较长

💡 面试官视角

  • 面试官可能会问"为什么年轻代使用标记-复制算法?"答:因为年轻代中大多数对象是短生命周期的,标记-复制算法能高效清理垃圾且无碎片问题。
  • 面试官可能会追问"标记-清除和标记-整理的区别是什么?"答:标记-清除直接回收垃圾,容易产生碎片;标记-整理会压缩内存,避免碎片但耗时更长。
相关推荐
KaMeidebaby5 小时前
卡梅德生物技术快报|PD1 单克隆抗体定制配套 N 糖全谱质控开发
前端·人工智能·算法·数据挖掘·数据分析
8Qi86 小时前
LeetCode 235. 二叉搜索树的最近公共祖先(LCA)
算法·leetcode·二叉树·递归·二叉搜索树·lca·迭代
bIo7lyA8v6 小时前
算法稳定性分析中的随机扰动建模的技术8
算法
科研online6 小时前
基于多源数据和XGBoost-SHAP分析中国大陆绿地碳汇空间变异影响因素的非线性相关性与尺度差异
算法·学习方法
Cthy_hy7 小时前
拓扑排序超详解:原理 + Kahn 贪心算法
python·算法·贪心算法
三品吉他手会点灯7 小时前
C语言学习笔记 - 43.运算符与表达式 - 运算符1 - 运算符的分类和简单介绍
c语言·笔记·学习·算法
心之伊始7 小时前
Java 后端接入大模型:从 Token、并发到推理成本的完整估算方法
java·spring boot·性能优化·大模型·llm
VkN2X2X4b7 小时前
算法复杂度的实验验证与误差分析的技术8
算法
其利天下技术8 小时前
风扇灯无刷电机自适应算法实战指南
算法·cocos2d·无刷电机自适应算法·bldc驱动自适应算法·其利无刷电机驱动算法
8Qi88 小时前
LeetCode 494:目标和(Target Sum)—— 题解 ✅
算法·leetcode·职场和发展·动态规划·01背包