【从零学习JVM|第九篇】常见的垃圾回收算法和垃圾回收器

前言:

我们知道在堆内存中,会有自动的垃圾回收功能,那今天这篇文章将会向你介绍,这个功能实现的方式,还有实现的对象,接下来就由我来给你们详细介绍垃圾回收的算法和实现算法的回收器。

目录

前言:

常见的四种垃圾回收算法

标记清除算法

核心思想

实现过程两个阶段

使用场景

标记整理算法

核心思想

实现过程

使用场景

复制算法

核心思想

实现过程

 使用场景

分代gc算法

核心思想

Minor GC 前的决策流程

 关键步骤详解

检查1:老年代空间 > 新生代总大小

检查2:老年代空间 > 历史平均晋升大小

检查失败:直接触发 Full GC

常见垃圾回收器

年轻代垃圾回收器(Minor GC)

1. Serial 收集器

2. ParNew 收集器

3. Parallel Scavenge 收集器

老年代垃圾回收器(Major GC/Full GC)

1. Serial Old 收集器

2. Parallel Old 收集器

3. CMS(Concurrent Mark-Sweep)收集器

G1垃圾回收器

G1 的垃圾回收过程

主要优点

主要缺点

不适用场景

总结


常见的四种垃圾回收算法

标记清除算法

核心思想

通过 可达性分析 标记存活对象,直接回收未标记对象的内存

实现过程两个阶段
  1. 标记阶段(STW)

    • 从 GC Roots(栈引用、静态变量等)出发,递归遍历对象图。

    • 对存活对象打标记。

  2. 清除阶段(STW)

    • 线性扫描堆内存。

    • 回收未标记对象的内存块(加入空闲链表)。

优点:实现简单,第一阶段标记,第二阶段清除。

缺点:

  • 碎片化内存:内存是连续的,如果在对象被删除之后,就会出现很多细小的内存,如果我们需要很大的内存空间,那么就很可能无法匹配。

很明显,无法做到,因为红色的就是空闲内存但是最大的才4个字节。

  • 分配速度慢:内存碎片化,所以在回收内存之后,会把这段空闲内存加入一个空闲链表,每次分配内存都会遍历整个链表找到合适的位置。
使用场景
  • 老年代回收:CMS 收集器的回收基础

  • 大对象堆:对象存活率高,移动成本大

  • 嵌入式系统:资源受限环境(如 RTOS)

标记整理算法

核心思想

在标记存活对象后,移动对象消除碎片,使空闲内存连续。我们可以把它看作是基于标记清除的一个处理碎片化内存的算法。

实现过程
  1. 标记阶段

    • 从 GC Roots(栈引用、静态变量等)出发,递归遍历对象图。

    • 对存活对象打标记。

  2. 整理阶段(STW)

    • 滑动整理:将存活对象“滑动”到内存一端。

    • 清理:清理掉没有存活对象。

优点:

  • 内存的使用效率高。
  • 没有碎片化内存。

缺点:

  • 整理阶段效率不高,效率是低于标记清除算法的
使用场景
  • 老年代回收:Serial Old, Parallel Old, ZGC

  • 低碎片需求:实时系统、长期运行服务

  • 内存敏感场景:Android ART 的 Foreground GC

复制算法

核心思想

将内存分为两等份,只使用其中一份;GC 时将存活对象复制到另一份空间,清空原空间。

实现过程
  1. 内存划分:堆分为 From 区(当前使用)和 To 区(空闲),创建对象时都只在From区。

  2. 垃圾回收阶段(STW)

    • 从 GC Roots 遍历存活对象

    • 将存活对象复制到 To 区(保持紧凑排列),删除from区对象

    • 交换 From/To 区角色

优点:

  • 不会发生碎片化
  •  回收高效(仅处理存活对象)

缺点:

  • 内存使用率低,每次只使用一半的内存
  • 对象复制开销大
 使用场景
  • 年轻代回收:HotSpot 的 Serial/ParNew/Parallel Scavenge

  • 短命对象场景:对象存活率 < 10% 时最优

  • 小内存区域:JVM 的 Survivor 区

分代gc算法

现代优秀的垃圾回收算法,会将上面的几种垃圾回收算法组合使用,其中应用最广的就是分代垃圾回收。

核心思想

基于

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值