PHP垃圾回收机制
引用计数
- 每个内存对象都分配一个计数器,当内存对象被变量引用时,计数器+1
- 当变量引用撤掉后,计数器-1
- 定期检查各内存对象的计数器,如果计数器=0,表明内存对象没有被使用,该内存对象则进行销毁
- 垃圾回收完成
四色标记
示例:
1 | <?php |
对象和数组,有循环引用的问题,针对这两种数据类型,采用四色标记法进行垃圾回收
黑色:正常数据
紫色:疑似垃圾
灰色:
白色:垃圾
- 将计数器 -1 过并且目前不为 0 的数组放到缓冲区,并将其标记为紫色
- 对缓冲区中的数组进行深度遍历,将紫色的元素标记为灰色,并计数器 -1
注意:只对元素进行标灰、-1 操作 - 再次深度扫描,检查灰色的元素,如果计数器不为 0,将其标记为黑色并计数器+1(上一步有-1 操作),如果计数器为 0,将其标记为白色
- 扫描数组,黑色的元素从缓冲区中移除,白色的元素计数器+1 并移到 to_free 列表
- 清除 to_free,完成垃圾回收
简单说:将疑似垃圾的数组的元素的计数器-1,=0 说明为垃圾,≠0 说明不是垃圾