垃圾回收算法(方法论) 10种垃圾回收器的组合(具体实现) 默认PS+PO
1、标记-清除算法(老年代使用)
标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象
- 效率问题
- 空间问题(标记清除后会产生大量不连续的碎片)
2、复制算法
它可以将内存分为的两块,每次使用其中的一块。当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉。这样就使每次的内存回收都是对内存区间的一半进行回收。
3、标记整理法
标记过程仍然与“标记-清除”算法一样。让所有存活的对象向一端移动,然后直接清理掉端边界以外的内存
4、分代收集( HotSpot 为什么要分为新生代和老年代?)
根据对象存活周期的不同将内存分为几块
每次收集都会有大量对象死去,所以可以选择复制算法,只需要付出少量对象的复制成本就可以完成每次垃圾收集。
而老年代的对象存活几率是比较高的,而且没有额外的空间对它进行分配担保,所以我们必须选择“标记-清除”或“标记-整理”算法进行垃圾收集。 补充:G1使用复制算法
垃圾回收器的发展:
从分代到不分代,是因为内存越来越大
serial 几十兆
parallel 几个G
CMS 几十个G 承上启下并发回收 --三色标记
G1 上百G内存 逻辑分代、物理不分代
ZGC-shennandoah --4T 逻辑物理都不分带
Epsilon 调试用、确认不用GC参与就能干活
1.8默认的垃圾回收器:
UseParallelGC 即 Parallel Scavenge + Parallel Old,再查看详细信息
垃圾收集器 stw=stop the word,除了垃圾回收线程,其他工作线程都停止。分代垃圾回收除了CMS都会产生STW
1、Serial 收集器(单线程),触发STW
Serial(串行)收集器收集器是最基本、历史最悠久的垃圾收集器了。
它的 “单线程” 的意义不仅仅意味着它只会使用一条垃圾收集线程去完成垃圾收集工作,更重要的是它在进行垃圾收集工作的时候必须暂停其他所有的工作线程( "Stop The World" ),直到它收集结束。
新生代采用复制算法,老年代采用标记-整理算法。
优缺点:简单而高效(与其他收集器的单线程相比)。Serial 收集器由于没有线程交互的开销,自然可以获得很高的单线程收集效率。Serial 收集器对于运行在 Client 模式下的虚拟机来说是个不错的选择。
2、ParNew 收集器(就是 Serial 收集器的多线程版本)
是为了配合CMS的并行回收,对paralle scavenge进行优化
3、Parallel Scavenge 收集器
Parallel Scavenge 收集器也是使用复制算法的多线程收集器
Parallel Scavenge 收集器关注点是吞吐量(高效率的利用 CPU)
4、重点
CMS 收集器(老年代)
CMS老年代并发,垃圾回收和应用程序同时进行,官方说法降低STW的时间(200毫秒)
CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。它非常符合在注重用户体验的应用上使用。
CMS(Concurrent Mark Sweep)收集器是 HotSpot 虚拟机第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程与用户线程(基本上)同时工作。
主要优点:并发收集、低停顿
缺点:
- 对 CPU 资源敏感;
- 无法处理浮动垃圾;
- 它使用的回收算法-“标记-清除”算法会导致收集结束时会有大量空间碎片产生。
初始标记(STW),找到GCROOT,就是最跟上的垃圾,数量较小,不再往下
并发标记(最耗时间,所以和工作线程一起,减少STW的时间), 根上垃圾继续往下找,同时工作线程也在,因为不是STW所以有失误
浮动垃圾:不是垃圾的后来变成垃圾,这次没回收掉没关系,下次没有GC连接,直接回收了
原来是垃圾的,后来又有引用,不再是垃圾了
重新标记(STW):修正并发标记的失误
G1收集器
G1开始,分区回收.G1有STW和FULLGC.逻辑上还是有分代
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)