【JVM-02】垃圾收集(回收)算法

【JVM-02】垃圾收集/回收算法

  • [1. 分代收集算法](#1. 分代收集算法)
  • [2. 标记-清除算法](#2. 标记-清除算法)
  • [3. 标记-复制算法](#3. 标记-复制算法)
  • [4. 标记-整理算法](#4. 标记-整理算法)

1. 分代收集算法

分代收集(回收)算法根据对象存活周期的不同将内存分为几块。一般将java堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。

比如在新生代中,每次收集都会有大量对象死去,所以可以选择复制算法,只需要付出少量对象的复制成本就可以完成每次垃圾收集。而老年代的对象存活几率是比较高的所以我们可以选择"标记-清理"或"标记-整理"算法进行垃圾收集。

2. 标记-清除算法

算法分为"标记"和"清除"阶段:首先标记出所有需要回收的对象,在标记完成后,统一清除(回收)掉所有被标记的对象,也可以反过来,标记存活的对象,统一回收所有未被标记的对象。它是最基础的收集算法,会带来两个明显的问题:第一个是执行效率不稳定,如果Java堆中包含大量对象,而且其中大部分是需要被回收的,这时必须进行大量标记和清除的动作,导致标记和清除两个过程的执行效率都随对象数量增长而降低;第二个是内存空间的碎片化问题,标记、清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致当以后在程序运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。

3. 标记-复制算法

标记-复制算法为了解决标记-清除算法面对大量可回收对象时执行效率低的问题。它可以将内存分为大小相同的两块,每次使用其中的一块。当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉。这样就使每次的内存回收都是对内存区间的一半进行回收。缺点是内存支持量偏低,优点是不会产生内存碎片。

4. 标记-整理算法

根据老年代的特点特出的一种标记算法,标记过程仍然与"标记-清除"算法一样,但后续步骤不是直接对可回收对象回收,而是让所有存活的对象向一段移动,然后直接清理掉端边界以外的内存。

相关推荐
一个不知名程序员www25 分钟前
算法学习入门 --- 哈希表和unordered_map、unordered_set(C++)
c++·算法
Sarvartha1 小时前
C++ STL 栈的便捷使用
c++·算法
夏鹏今天学习了吗2 小时前
【LeetCode热题100(92/100)】多数元素
算法·leetcode·职场和发展
飞Link2 小时前
深度解析 MSER 最大稳定极值区域算法
人工智能·opencv·算法·计算机视觉
bubiyoushang8882 小时前
基于CLEAN算法的杂波抑制Matlab仿真实现
数据结构·算法·matlab
2401_894828123 小时前
从原理到实战:随机森林算法全解析(附 Python 完整代码)
开发语言·python·算法·随机森林
Remember_9933 小时前
【LeetCode精选算法】前缀和专题二
算法·哈希算法·散列表
源代码•宸3 小时前
Leetcode—509. 斐波那契数【简单】
经验分享·算法·leetcode·面试·golang·记忆化搜索·动规
博大世界4 小时前
matlab结构体数组定义
数据结构·算法
Loo国昌4 小时前
【LangChain1.0】第九阶段:文档处理工程 (LlamaIndex)
人工智能·后端·python·算法·langchain