1. PHP可以自动进行内存管理,清除不需要的对象,主要使用了引用计数
2. 在zval结构体中定义了ref_count和is_ref , ref_count是引用计数 ,标识此zval被多少个变量引用 , 为0时会被销毁
is_ref标识是否使用的 &取地址符强制引用
3. 为了解决循环引用内存泄露问题 , 使用同步周期回收算法
比如当数组或对象循环的引用自身 , unset掉数组的时候 , 当refcount-1后还大于0的 , 就会被当成疑似垃圾 , 会进行遍历 ,并且模拟的删除一次refcount-1如果是0就删除 ,如果不是0就恢复
顽固垃圾的产生过程
<?php
$a = "new string";
?>
代码中,$a变量内部存储信息为
a: (refcount_gc=1, is_ref_gc=0)='new string'
当把$a赋值给另外一个变量的时候,$a对应的zval的refcount_gc会加1
<?php
$a = "new string";
$b = $a;
?>
此时$a和$b变量对应的内部存储信息为,$a和$b同时指向一个字符串"new string" ,它的refcount变成2
a,b: (refcount_gc=2, is_ref=0)='new string'
当用unset删除$b变量时,"new string" 的refcount_gc会减1变成1。