上次我们谈到了引用计数和is_ref,这里有内存泄漏。
复制代码代码如下所示:
$ =数组(1, 2,$ A);
unset(美元);

在旧PHP版本中,将出现内存泄漏,其分析如下:

在第一行中,你可以知道变量引用计数= 2美元和$ { 2 }点,is_ref = 1

然后第二行的实施,美元将从符号表中删除指向变量引用计数,在引用计数= 1,= 0和机制,因为引用计数!将不会被垃圾收集,但现在我们已经失去了入口$ { 2 }的机制,这样的机制已经成为一件垃圾

同样的原因也可能发生在类的内部引用中,例如
复制代码代码如下所示:
一个新的男人();
$;
unset(美元);

因此,如何解决这个问题,新的GC机制使用了一个算法来解决这个问题。

PHP有一个用于存储变量节点信息根缓冲,当缓冲区满的根或手动调用GC,GC算法开始

对于一个数组或类类型的变量,在垃圾收集机制的启动,在zval阵列/班/内部要素的变量和引用计数的遍历成员1算法,如果对引用计数变量遍历完成减少到0,那么这是一个zval垃圾,他将被破坏,见下面的例子
复制代码代码如下所示:
$ =数组(1, 2,$ A,$ A);
unset(美元);

要知道,一点美元机制很容易,假设Z1是引用计数= 3,is_ref = 1

When unset ($a) is executed, $a has been deleted from the symbol table, and we also lose the access to Z1, at this time Z1 refcount=2, is_ref=1

当GC开始,途经1对Z1数组元素的变量。它以0减去。当穿越一{ 2 },Z1引用计数和{ 3 } Z1引用计数,然后Z1 Z1 = 0,它可以被称为记忆的垃圾,和算法将恢复算法。

综上所述,可以说,如果一个变量数组类型是遍历的元素的机制,它会遍历引用计数机制,同时,如果最后一个引用计数为0的变量是垃圾,它需要恢复。