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

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

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

1. 分代收集算法

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

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

2. 标记-清除算法

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

3. 标记-复制算法

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

4. 标记-整理算法

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

相关推荐
智驱力人工智能2 小时前
AI移动监测:仓储环境安全的“全天候守护者”
人工智能·算法·安全·边缘计算·行为识别·移动监测·动物检测
暮乘白帝过重山3 小时前
JVM类加载机制
jvm
代码小将4 小时前
力扣992做题笔记
算法·leetcode
编程绿豆侠4 小时前
力扣HOT100之二叉树:199. 二叉树的右视图
算法·leetcode·职场和发展
飞川撸码5 小时前
【LeetCode 热题100】17:电话号码的字母组合(详细解析)(Go语言版)
算法·leetcode·golang·dfs
蒟蒻小袁5 小时前
力扣面试150题--从前序与中序遍历序列构造二叉树
算法·leetcode·面试
NeilNiu6 小时前
一、内存调优
jvm
闭月之泪舞6 小时前
初识函数------了解函数的定义、函数的参数、函数的返回值、说明文档的书写、函数的嵌套使用、变量的作用域(全局变量与局部变量)
python·算法·机器学习
GUIQU.6 小时前
【每日一题丨2025年5.12~5.18】排序相关题
算法·排序·每日一题
哪 吒6 小时前
2025B卷 - 华为OD机试七日集训第2期 - 按算法分类,由易到难,循序渐进,玩转OD(Python/JS/C/C++)
python·算法·华为od·华为od机试·2025b卷