php垃圾回收流程


php垃圾回收流程


1.gc_mark_roots()

   这个函数对节点信息的链表进行一次深度优先遍历,将其中的zval的refcount减1,为了避免对同一个zval重复减操作,在操作之后将zval标记成灰色。(对节点自身的zval可以重复减操作,这个是此算法的基础)

 

2.gc_scan_roots()

  这个函数对节点信息的链表再次进行深度优先遍历,如果发现zval的refcount大于等于1,则对该zval和其包含的zval的refcount加1操作,这个是对非垃圾的一个信息还原,然后将这些zval颜色属性去掉(设置成black)。如果发现zval的refcount等于0,则就标记成白色,这些是后面将要清理掉的垃圾。

 

3.gc_collect_roots()

   遍历节点信息链表,将前面一个步骤中标记为白色的节点信息放到GC_G(zval_to_free)为入口的链表中,这个链表用来存放将要释放的垃圾。 然后释放掉全部的节点信息,缓冲区被清空。分析结束后将重新收集节点信息。

 

4.释放步骤3中收集到垃圾数据。



鼎云博客
  • 最新评论
  • 总共0条评论