NOTE
1.1 GC
1. 什么是GC 针对堆内存的自动内存回收机制 2. 为什么需要GC 把程序员从手动free内存的工作中释放出来 2.1. GC的问题 2.1.1. 内存泄露 内存泄露.md 2.1.2. STW STW.md 3. 如何进行垃圾回收 3.1. GC触发 定时或者内存空间不足时 3.2. 垃圾回收
这是历史学习笔记,可能存在过时或不完整的理解。
0. 版本说明(2026)
这是一篇早期的跨语言 GC 概念笔记。不同运行时和版本的 GC 触发条件、GC Root 定义与回收策略并不相同;“分代垃圾回收”是一类常见设计,不是所有垃圾回收器都必须采用。
1. 什么是GC
针对堆内存的自动内存回收机制
2. 为什么需要GC
把程序员从手动free内存的工作中释放出来
2.1. GC的问题
2.1.1. 内存泄露
2.1.2. STW
3. 如何进行垃圾回收
3.1. GC触发
定时或者内存空间不足时
3.2. 垃圾回收
3.2.1. 引用计数法
每个对象都有一个计数器,有变量引用时+1,引用失效则-1。当计数器为0的时候则对其进行回收
优点:简单高效 缺点:无法解决循环引用的问题。循环引用是指A对象引用B对象,B对象又引用A对象,但是A,B对象已不被任何其他对象引用
3.2.2. 可达性分析
从GC Root出发,通过引用关系遍历对象图,能到达的不是垃圾 GC Root:全局变量、栈上的局部变量、寄存器上的变量
3.2.2.1. 标记清除
标记:从GC Root出发,标记所有可达的对象。未被标记的就是垃圾对象 清除:清除所有未被标记的对象 缺点:会产生内存碎片(不连续的内存空间), 需要分配较大的对象时,无法找到足够的连续内存空间。
3.2.2.2. 标记整理
标记:从GC Root出发,标记所有可达的对象。未被标记的就是垃圾对象 整理:把所有存活的对象移动到一边,对其他区域回收 优点:解决了内存碎片的问题 缺点:移动对象的成本较高
3.2.2.3. 复制
把内存空间分成两块,每次只使用其中一块,用完之后把存活的对象复制到另一块内存空间 优点:效率高,没有内存碎片 缺点:每次只能利用一半的空间
3.2.2.4. 分代垃圾回收
根据对象的存活时间把内存分成新生代和老年代 新生代的特点是每次回收只有少量对象存活,因此采用改进的复制算法 老年代的特点是有大量对象存活,采用标记清除、标记整理算法