在PHP中的变量占用的空间是不需要我们手动回收的,内核帮我们处理了这部分的工作。相比C,这大大方便了我们的操作。这里主要说一下变量的GC机制
在我们了解GC时,有必要介绍一哈变量在底层的实现。
zval的结构
struct _zval_struct {
zend_value value;
union{
....
}u1;
union{
....
}
};
由于主要说垃圾回收,所以在这里简单介绍下U1和U2联合体的功能
U1 结构比较复杂,我认为主要是用于识别变量类型
U2 大多数都是辅助字段,变量内部功能的实现、提升缓存友好型
接下来是我们的主角:zend_value,它也是结构体中内嵌的一个联合体
typeof union _zend_value{
zend_long lval;//整形
double dval;//浮点型
zend_refcounted *counted;//获取不通类型的GC头部
zend_string *str;//string字符串
zend_array *arr;//数组
zend_object *obj;//对象
zend_resource *res;//资源
zend_reference *ref;//是否是引用类型
....
} zend_value;
在zval的value中就记录了引用计数zend_refcounted *counted这个类型,垃圾回收机制也是基于此的。
所有的复杂类型的定义,开始的时候都是zend_refcounted_h结构,这个结构里出了引用计数以外,还有GC相关的结构,从而在做GC回收的时候。GC不需要关心具体类型是什么,所有的它都可以当做zend_refcounted*结构来处理
在PHP中出了array和object类型的变量,其余大部分是自动回收,PHP普通变量的回收和该变量的引用次数相关。
评论