要解决的问题
- 如何理解高级语言的垃圾回收
解决方案
GC标记-清除,引用计数,GC复制算法是3个经典的垃圾回收算法,高级语言的垃圾回收策略通常是以上3个算法的组合应用和优化实现。
构成
构成 | 解释 |
---|---|
mutator | 应用程序 |
object | 应用程序生成的动态对象。被应用程序继续引用的对象为活动对象,不再被引用的对象为非活动对象。GC过程是释放非活动对象占用的内存空间 |
heap | 堆,存放动态对象的内存空间。垃圾回收是指回收堆中不再被 mutator 引用的空间 |
pointer | 指针,object之间通过指针来描述引用关系 |
root | 根,活动对象之间通过指针连接,构成一个树形结构。根用于描述树形结构的起点。通过根可以遍历(追踪)活动对象 |
chunk | 分块,垃圾回收的基本单位。heap中有多个分块 |
allocation | 为对象分配空闲分块的过程 |
collection | 回收垃圾分块的过程 |
衍生的问题
解决方案案例
Golang 的 GC
Golang 1.5版本之后利用三色标记-清除算法实现垃圾回收。在标记阶段,存在STW。目前1.7版本之后,STW耗时已经优化到1ms。
Python 的 GC
Python 使用引用计数算法实现垃圾回收。为了解决循环引用无法被回收的问题,python 同时使用部分标记-清除算法进行回收。
Java 的 GC
Java 使用分代垃圾回收。将对象分成新生代、老年代,针对不同的代,使用不同的GC算法。分代垃圾回收是GC复制和标记清除算法的组合应用。