云时代的 JVM 原理与实战
康杨
京东资深架构师
3111 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 39 讲
云时代的 JVM 原理与实战
15
15
1.0x
00:00/00:00
登录|注册

14|垃圾回收(下):揭秘垃圾回收中的算法

你好,我是康杨。
上节课我们聊了 JVM 是如何定位一个待回收的对象的,这节课我们继续看针对已经定位的垃圾对象 JVM 是如何进行回收的,也就是 JVM 中的垃圾回收算法。
垃圾回收算法种类很多,它是不断演进的各种垃圾回收器的理论基础。掌握垃圾回收算法,能帮助我们看清 JVM 中垃圾回收器的本质和演进趋势。今天让我们从最简单的标记 - 清除算法开始学起。

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

标记 - 清除算法是最早提出并实现的垃圾回收算法,虽然和现在越来越智能的垃圾回收算法相比,标记 - 清除算法显得非常简单,但是它却是后面这些垃圾回收算法的思想基础和发展之源。可以认为我们现在使用的各种垃圾回收算法都是基于标记 - 清除算法的思想不断改进、演化而来的,所以标记 - 清除算法是必须要掌握的。

详细步骤

在标记 - 清除算法中,我们把垃圾回收的过程划分成标记和清除两个阶段。
标记阶段
基于我们在上节课中提到的可达性分析算法,从根对象开始遍历所有的可达对象并标记它们。
清除阶段
清除所有未被标记的对象。这个地方需要注意的是清除对象的顺序并不影响算法的结果。最简单的清除算法就是逐一检查每个对象并释放未被标记的对象。

优劣势分析

标记 - 清除算法的一个重要挑战在于如何有效地处理空间碎片,因为每次回收后内存中都会存在大量不连续的碎片,即使这些内存碎片的空间总和足够装下这个对象,也没办法有效地分配给大型对象,从而影响 JVM 的性能和可靠性。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了JVM中的垃圾回收算法,包括标记-清除算法、复制算法、标记-压缩算法和分代收集算法。标记-清除算法通过标记可达对象并清除未标记对象的方式进行垃圾回收,但存在空间碎片和执行效率低的问题。复制算法将内存空间分为两部分,通过复制和清理阶段实现垃圾回收,避免了碎片化问题,但内存利用率较低。标记-压缩算法则通过移动活动对象以连续化空闲空间,但效率较低。分代收集算法根据对象生命周期将Java堆划分为新生代和老年代,提高内存回收效率。文章通过详细步骤和优劣势分析,全面介绍了这些垃圾回收算法的特点和适用场景,为读者提供了深入了解JVM垃圾回收算法的基础知识。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《云时代的 JVM 原理与实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(3)

  • 最新
  • 精选
  • peter
    请教老师几个问题: Q1:“清除”在物理层面是怎么操作的?擦除该部分内存的数据吗? 或者将该部分内存全都置为0吗? Q2:复制算法的改进版本,“需要大量编程”,是业务层面的编码吗?还是指JVM实现部分的编码? Q3:垃圾收集,是JVM创建线程进行收集吗? Q4:程序员写程序能感觉到GC吗?
    2023-09-20归属地:北京
    1
  • 3.0的A7
    标记清除和标记压缩,是一个东西吧,我看有的人说是标记清除,有的说是超级压缩
    2024-03-01归属地:北京
  • 感觉讲的比较笼统,Eden,Survivor具体是指什么,感觉没讲明白。
    2023-12-07归属地:广东
收起评论
大纲
固定大纲
标记 - 清除算法(Mark-Sweep)
详细步骤
优劣势分析
显示
设置
留言
3
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部