谈到引用计数器和垃圾回收机制,必须得从php变量说起。总所周知,php是一种弱类型,但具体表现在哪里,程序里面又是怎么表现的呢?php里面又是怎样实现引用计数器的,程序如何区分变量引用和复制?php是如何对已用完的变量进行回收,不同的php版本的不同的垃圾回收机制又是如何实现的?引用计数器讲到引用计数器,不得不先说一下变量的c语言实现。如下,几个变量的结构体和联合体:zvalue_value联合体:typedef union _zvalue_value { long lval; /* long value */ double dval; /* double value */ struct { char *val; int len; } str; HashTable *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_NULLN/:首先是PHP的数组其实就是一个HashTable,这就解释了为什么PHP能够支持关联数组了;其次,Resource就是一个long值,它里面存放的通常是个指针、一个内部数组的index或者其它什么只有创建者自己才知道的东西,可以将其视作一个handle。写复制(CopyonWrite)<?php $var="laruence";$var_dup=$var;$var=1;?>PHP在修改一个变量以前,会首先查看这个变量的refcount,如果refcount大于1,PHP就会执行一个分离的例程,对于上面的代码,当执行到第三行的时候,PHP发现$var指向的zval的refcount大于1,那么PHP就会复制一个新的zval出来,将原zval的refcount减1,并修改symbol_table,使得$var和$var_dup分离(Separation)。这个机制就是所谓的copyonwrite(写时复制)。题外话:写时复制技术的一个比较有名的应用是在unix类操作系统内核中,当一个
Php引用计时器和垃圾回收机制 来自淘豆网m.daumloan.com转载请标明出处.