PHP垃圾回收机制

本文最后更新于:2023年12月5日 晚上

引用计数

  1. 每个内存对象都分配一个计数器,当内存对象被变量引用时,计数器+1
  2. 当变量引用撤掉后,计数器-1
  3. 定期检查各内存对象的计数器,如果计数器=0,表明内存对象没有被使用,该内存对象则进行销毁
  4. 垃圾回收完成

四色标记

示例:

<?php
$a = [];		# 计数器 = 1
$a[] = &$a;		# 计数器 = 2

unset($a);		# 计数器 = 1

对象和数组,有循环引用的问题,针对这两种数据类型,采用四色标记法进行垃圾回收

黑色:正常数据
紫色:疑似垃圾
灰色:
白色:垃圾

  1. 将计数器 -1 过并且目前不为 0 的数组放到缓冲区,并将其标记为紫色
  2. 对缓冲区中的数组进行深度遍历,将紫色的元素标记为灰色,并计数器 -1
    注意:只对元素进行标灰、-1 操作
  3. 再次深度扫描,检查灰色的元素,如果计数器不为 0,将其标记为黑色并计数器+1(上一步有-1 操作),如果计数器为 0,将其标记为白色
  4. 扫描数组,黑色的元素从缓冲区中移除,白色的元素计数器+1 并移到 to_free 列表
  5. 清除 to_free,完成垃圾回收

简单说:将疑似垃圾的数组的元素的计数器-1,=0 说明为垃圾,≠0 说明不是垃圾


PHP垃圾回收机制
http://blog.lujinkai.cn/PHP/源码/PHP垃圾回收机制/
作者
像方便面一样的男子
发布于
2021年2月2日
更新于
2023年12月5日
许可协议