php的垃圾回收机制

每一个php的变量都在一个名为zval的变量容器里面,里面包含了变量的类型,值,一个is_ref(bool)标识是否引用变量(&),还有一个refcount标记该zval容器里面的变量个数,通过refcount值来判断是否销毁变量;所有的符号存在一个符号表,每个符号都有作用于,包括脚本,函数或者方法

string

<?php
$a = "new string";
//生成一个zval变量容器 is_ref是false,因为没有自定义引用,所以引用次数recount为1
$b = $a;
//$b与$a关联,php本身不会去再创建新的容器,此时recount为2,变量容器在”refcount“变成0时就被销毁.
//当任何关联到某个变量容器的变量离开它的作用域(比如:函数执行结束),或者对变量调用了函数 unset()时,”refcount“就会减1

array/objec

<?php
$a = array( 'meaning' => 'life', 'number' => 42 );
//此时会创建三个变量容器,一个是$a,一个是meaning,还有一个number, 三个的容器里面的recount都是1,其余形式与string相同形式

引用(&)将自己添加到自己的容器

<?php
$a = array( 'one' );
$a[] =& $a;
// 此时会有三个容器,$a 容器包含了两个容器,一个表示原始的 one (is_ref为 false),另一个标识 引用的one(is_ref 为 true)
引用造成的大坑:

由于数组元素(标记为is_ref true)仍然指向数组本身,因为没有另外的符号指向它,用户没有办法清除这个结构,结果就会导致内存泄漏,在脚本执行结束才会清除,对于长时间执行的脚本,就会耗费内存,对象引用 同原理,由于隐式引用甚至更严重。

在 5.3 版本之后,做了这些优化:
并不是每次引用计数减少时都进入回收周期,在PHP执行中,一旦根缓冲区满了或者调用gc_collect_cycles() 函数时,就开始垃圾回收;
可以解决循环引用问题;

可以总将内存泄露保持在一个阈值以下。

所以引用完,千万记得要unset不必要的变量

参考地址:http://docs.php.net/manual/zh/features.gc.refcounting-basics.php

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值