GC基本概念
GC基本技术实现
GC就是Mark和Sweep,第一步标记活的节点,第二步清除死的节点。
首先讲Mark
Mark
mark怎么做呢?首先每个Runtime都会有Roots对象,运行时的创建对象也会跟Roots挂上关系。
所以我们从Roots标记就可以了。
伪代码:
worklist = Roots while worklist is not empty: item = worklist.pop() for field in item: child = *field if child not null && child not marked: mark item worklist.push(item)
有个问题是哪些是Roots对象? 基础对象(Runtime初始化时就有的对象)、运行栈里的对象,都是Roots对象。
Sweep
对于Sweep来说,就是扫描整个堆,如果扫到的对象不是被Mark的,就调用Free(object)。这个堆是Runtime的堆,是存放了连续的Object地址的数组(注意,这里不存放对象内容)。
for object in heap: if object is not marked: Free(object)
参考
https://en.wikipedia.org/wiki/Tracing_garbage_collection
https://v8.dev/blog/high-performance-cpp-gc
https://liujiacai.net/blog/2018/07/08/mark-sweep/