14|垃圾回收(下):揭秘垃圾回收中的算法
康杨
你好,我是康杨。
上节课我们聊了 JVM 是如何定位一个待回收的对象的,这节课我们继续看针对已经定位的垃圾对象 JVM 是如何进行回收的,也就是 JVM 中的垃圾回收算法。
垃圾回收算法种类很多,它是不断演进的各种垃圾回收器的理论基础。掌握垃圾回收算法,能帮助我们看清 JVM 中垃圾回收器的本质和演进趋势。今天让我们从最简单的标记 - 清除算法开始学起。
标记 - 清除算法(Mark-Sweep)
标记 - 清除算法是最早提出并实现的垃圾回收算法,虽然和现在越来越智能的垃圾回收算法相比,标记 - 清除算法显得非常简单,但是它却是后面这些垃圾回收算法的思想基础和发展之源。可以认为我们现在使用的各种垃圾回收算法都是基于标记 - 清除算法的思想不断改进、演化而来的,所以标记 - 清除算法是必须要掌握的。
详细步骤
在标记 - 清除算法中,我们把垃圾回收的过程划分成标记和清除两个阶段。
标记阶段
基于我们在上节课中提到的可达性分析算法,从根对象开始遍历所有的可达对象并标记它们。
清除阶段
清除所有未被标记的对象。这个地方需要注意的是清除对象的顺序并不影响算法的结果。最简单的清除算法就是逐一检查每个对象并释放未被标记的对象。
优劣势分析
标记 - 清除算法的一个重要挑战在于如何有效地处理空间碎片,因为每次回收后内存中都会存在大量不连续的碎片,即使这些内存碎片的空间总和足够装下这个对象,也没办法有效地分配给大型对象,从而影响 JVM 的性能和可靠性。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了JVM中的垃圾回收算法,包括标记-清除算法、复制算法、标记-压缩算法和分代收集算法。标记-清除算法通过标记可达对象并清除未标记对象的方式进行垃圾回收,但存在空间碎片和执行效率低的问题。复制算法将内存空间分为两部分,通过复制和清理阶段实现垃圾回收,避免了碎片化问题,但内存利用率较低。标记-压缩算法则通过移动活动对象以连续化空闲空间,但效率较低。分代收集算法根据对象生命周期将Java堆划分为新生代和老年代,提高内存回收效率。文章通过详细步骤和优劣势分析,全面介绍了这些垃圾回收算法的特点和适用场景,为读者提供了深入了解JVM垃圾回收算法的基础知识。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《云时代的 JVM 原理与实战》,新⼈⾸单¥59
《云时代的 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归属地:广东
收起评论