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/

posted @ 2020-12-10 15:41  xuyv  阅读(209)  评论(0编辑  收藏  举报