PHP 7 的内存回收原理?

在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普通变量的回收和该变量的引用次数相关。

评论

(= ̄ω ̄=)··· 暂无内容!

回复

您还未登录,请先登录或者注册