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中收集到垃圾数据。
无论从事什么行业,只要做好两件事就够了,一个是你的专业、一个是你的人品,专业决定了你的存在,人品决定了你的人脉,剩下的就是坚持,用善良專業和真诚赢取更多的信任。