PHP垃圾回收机制(Garbage Collection . GC)

PHP垃圾回收机制(GarbageCollection . GC)

 

PHP把变量保存在zval容器里面。容器,container,可以想像成一块存储区域,或者一个盒子。

盒子里面包括以下几部分

(1)    Type:  string

(2)    Value:this is

(3)    Is_ref:  // 是否为引用 bool 值

(4)    Refcount: // 引用计数次数也就是被引用了几次当refcount为0的时候,该容器会被删除掉,释放空间出来。当refcount为1的时候,is_ref必须为0。

 

其中一个叫做”is_ref”, 它是一个bool型的值,占用一个bit,表示该zval容器(也就是这个变量)是否被引用。

php就是使用这个bit来判断变量是个普通变量,或者是个引用(reference)。

说起来,PHP有二种引用:

其一是用户代码中的&

其二是PHP内部实现的引用计数机制(internal reference counting mechanism),用来优化内存使用的。

is_ref是指&

zval容器中的另外一部分,是”refcount”,引用计数。用来记录有多少个变量指向这个zval容器。

通常吧,这个时候我们只说symbol(符号),不说variables(变量),其实是同一个意思。

当refcount为1的时候,is_ref必须为0。

当refcount为0的时候,该容器会被删除掉,释放空间出来。

所有的symbol保存在一张symbol table里面(符号表)。

php维护了很多张这样的表,GLOBAL一张,每个函数一张。类的每个方法也有一张。

基本上是按照变量的作用域(scope)来建表的。

当我们用一个constant value(常量)来为变量赋值的时候,zval容器才会被创建出来。

 

$a = "this is";

 

 Zval容器对应的关系为

(1)Type : string

(2)Value: this is

(3)Is_ref: false

(4)Refcount : 1 ;

 

(二) 变量的赋值

 

$a = "this is";

$b = $a;

$c = $a ;

 

Zval 容器对应的关系为

(1)Type : string

(2)Value: this is

(3)Is_ref: false

(4)Refcount : 3   ;  表示有3个符号指向这个容器

 

但是如果产生了新的内容,php则会创建一个zval容器

$a = "this is";

$b = $a;

$c = $a ;

$c = 12 ;

 

Zval(1) 容器对应的关系为

(1)Type : string

(2)Value: this is

(3)Is_ref: false

(4)Refcount : 2   ;  表示有2个符号指向这个容器

 

Zval(2) 为$c新创建一个容器对应的关系为

 

(1)Type : int

(2)Value: 2

(3)Is_ref: false

(4)Refcount : 1   ;  表示有1个符号指向这个容器

 

 

(三) 变量的引用

 

 

$a = "this is";

$b =& $a;

$c = &$a ;

 

Zval 容器对应的关系为

(1)Type : string

(2)Value: this is

(3)Is_ref: true

(4)Refcount : 3   ;  表示有3个符号指向这个容器

符号a b和c都指向同一个容器,而且这个容器的is_ref位为1(因为&出现了)

 

引用赋值与普通赋值的区别就在于容器的is_ref位为1还是为0。
如果为1,改变任意一个变量的值,只是会更改容器的值。
如果为0,改变任意一个变量的值,都会创建一个新的容器出来。

 

(四) 变量赋值与引用

 

 

$a = "this is";

$b =$a;

$c = &$a ;

 

// 此会产生两个zval容器

Zval(1) 容器对应的关系为

(1)Type : string

(2)Value: this is

(3)Is_ref: false 非引用,这里是$a 所指

(4)Refcount : 1   ;  表示有3个符号指向这个容器

 

Zval(2) 容器对应的关系为

(1)Type : string

(2)Value: this is

(3)Is_ref: true 是引用,这里是$C=&$a 所指

(4)Refcount : 2   ;  表示有2个符号($b,$c)指向这个容器

 

(五) PHP如何处理数组和对象

 

每个数组都维护了一张自己的符号表,保存了自己的元素。
看代码:

 

 

 

$a = array( "meaning" => "life", "number" => 42 );

xdebug_debug_zval( "a" );

会显示:

a: (refcount=1, is_ref=0)=array (

        "meaning" => (refcount=1, is_ref=0)="life",

        "number" => (refcount=1, is_ref=0)=42

)

 

 

$a = array("one");

$a[] = &$a;

unset($a);

 

参考文献 

http://blog.csdn.net/samxx8/article/details/37564103

// 大数据 

http://blog.csdn.net/samxx8/article/details/37561363


 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值