php 引用计数器和垃圾回收机制
谈到引用计数器和垃圾回收机制,必须得从
php 变量说起。总所周知,php
是一种弱类型,但具体表现在哪里,程序里面又是怎么表现的呢?
php 里面又
是怎样实现引用计数器的,程序如何区分变量引用和复制?
php 是如何对已用
完的变量进行回收,不同的
php 版本的不同的垃圾回收机制又是如何实现的?
1.
引用计数器
讲到引用计数器,不得不先说一下变量的
c 语言实现。如下,几个变量的结构体和联合
体:
zvalue_value 联合体:
typedef union _zvalue_value {
long lval;
/* long value */
double dval;
/* double value */
struct {
char *val;
int len;
} str;
H
hTable *ht;
/* hash table value */
zend_object_value obj;
} zvalue_value;
zval
的结构:
struct _zval_struct {
/* Variable information */
zvalue_value value;
/* value */
zend_uint refcount__gc;
zend_uchar type;
/* active type */
zend_uchar is_ref__gc;
};
zval 可以看成一个容器,zvalue_value 是该容器存储变量值的联合体,
refcount__gc 是引用计数,记录引用数,is_ref__gc 是标志这个容器是否真正的引用,
type 表示这个变量的类型。
zend 根据 type 值来决定访问 value 的哪个成员,可用值如下:
IS_NULL
N/A
IS_LONG
对应
value.lval
IS_DOUBLE
对应
value.dval
IS_STRING
对应
value.str
IS_ARRAY
对应
value.ht
IS_OBJECT
对应
value.obj
IS_BOOL
对应
value.lval.
IS_RESOURCE
对应
value.lval