JVM之经典垃圾回收器

一、垃圾回收算法

1. 标记-清除(Mark-Sweep)
  • 步骤 :
    1. 标记:遍历对象图,标记所有存活对象。
    2. 清除:回收未被标记的垃圾对象。
  • 特点:简单,但会产生内存碎片。
2. 标记-复制(Mark-Copy)
  • 步骤 :
    1. 将内存分为两个区域(From 和 To)。
    2. 标记存活对象,复制到 To 区。
    3. 清空 From 区,交换 From/To 角色。
  • 特点:无碎片,但浪费一半内存。
3. 标记-整理(Mark-Compact)
  • 步骤 :
    1. 标记存活对象。
    2. 整理存活对象到内存一端。
    3. 清理边界外的空间。
  • 特点:无碎片,但整理耗时。
4. 分代收集
  • 核心思想:将堆分为新生代和老年代,分别用不同算法。
  • 新生代:标记-复制。
  • 老年代:标记-清除或标记-整理。

二、收集器执行流程图示

1. Serial / Serial Old
复制代码
[新生代(标记-复制)]
1. 暂停所有用户线程(STW)
   ┌───────────┐       ┌───────────┐
   │  From区   │ ----> │   To区    │
   │存活对象复制│       │ 清空后作为 │
   └───────────┘       |  新From   |
                       └───────────┘

[老年代(标记-整理)]
1. 标记存活对象
2. 整理到内存一端
3. 清理剩余空间
2. ParNew
复制代码
[多线程 标记-复制]
1. STW,多个线程并行复制存活对象

2. 清空 From 区
3. Parallel Scavenge / Parallel Old
复制代码
[新生代(标记-复制)]
1. 多线程快速复制,专注吞吐量
   

[老年代(标记-整理)]
1. 多线程整理,最大化利用CPU
4. CMS
复制代码
[标记-清除算法]
1. 初始标记(STW短暂) --> 标记根对象
   │
2. 并发标记          --> 线程与用户线程并行标记
   │
3. 重新标记(STW)    --> 修正并发期间的变动
   │
4. 并发清除          --> 清理垃圾(产生碎片)
5. G1
复制代码
[混合算法(标记-复制 + 标记-整理)]
1. 初始标记(STW短暂)  
   │
2. 并发标记          
   │
3. 最终标记(STW)    
   │
4. 筛选回收(STW可控) --> 选择垃圾最多的Region复制/整理
相关推荐
code2cat5 分钟前
Java工具篇之Gradle:用任务图组织构建与交付
java·开发语言·单元测试·gradle
后台模板学习1 小时前
大模型 Prompt 工程在电商订单系统中的踩坑记录
java·python·prompt
w_zero_one1 小时前
算法--构造
java·数据结构·算法
SL_staff1 小时前
制造业订单交付崩盘?用四层协同框架重建交付可信度(技术实践)
java·产品·全栈
SL_staff2 小时前
打破风控迭代死循环:用决策编排重构业务与技术协作链路
java·产品·全栈
Mikko72 小时前
Redis 连接数满了服务端有错误信息吗?连接数不增加却命令超时?6.2 实测连接池、超时与大 key 怎么判定
java·spring boot·redis·后端
.Bryce.3 小时前
从零到一开发技术名词大全:从需求分析到 AI Agent 工程
java·网络·人工智能·agent·需求分析·agent评测
SL_staff3 小时前
JVS-APS的7个刚性约束设计:从无限产能幻觉到可执行排产的工程实践
java·spring cloud·全栈
代码山河4 小时前
基本类型转换:自动类型转换与强制类型转换
java·学习·架构·教程·面向对象·项目
Escalating_xu5 小时前
【Linux 网络编程】五种 I/O 模型与非阻塞 I/O:从“等数据”到正确处理 EAGAIN
java·linux·网络