
每个php变量存在一个叫"zval"的变量容器中。一个zval变量容器,除了包含变量的类型和值,还包含两个字节的额外信息。第一个是"is_ref",是个bool值,用来标识这个变量是否是属于引用集合(reference set)。经由过程这个字节,php引擎才能把通俗变量和引用变量区分开来,因为php许可用户经由过程应用&来应用自定义引用,zval变量容器中还有一个内部引用计数机制,来竽暌古化内存应用。第二个额外字节是"refcount",用以表示指向这个zval变量容器的变量(也称符号即symbol)个数。所有的符号存在一个符号表中,个中每个符号都有感化域(scope),那些主脚本(比如:经由过程浏览器请求的的脚本)和每个函数或者办法也都有感化域。
当一个变量被赋常量值瓯,就会生成一个zval变量容器,如下例如许:
例1 生成一个新的zval容器
- <?php
- $a = "new string";
- ?>
在上例中,新的变量a,是在当缁?用域中生成的。并且生成潦攀类型为 string 和值为new string的变量容器。在额外的两个字节信息中,"is_ref"被默认设置为 FALSE,因为没有任何自定义的引用生成。"refcount" 被设定为 1,因为这里只有一个变量应用这个变量容器. 留意到当"refcount"的值是1时,"is_ref"的值老是FALSE. 如不雅你已经安装了» Xdebug,你能经由过程调用函数 xdebug_debug_zval()显示"refcount"和"is_ref"的值。
例2 显示zval信息
- <?php
- xdebug_debug_zval('a');
- ?>
以上例程会输出:
- a: (refcount=1, is_ref=0)=array (
- 'life' => (refcount=1, is_ref=0)='life'
- )
- a: (refcount=1, is_ref=0)='new string'
把一个变量赋值给另一变量将增长引用次数(refcount).
例3 增长一个zval的引用计数
- <?php
- $a = "new string";
- $b = $a;
- xdebug_debug_zval( 'a' );
- ?>
以上例程会输出:
这时,引用次数是2,因为同一个变量容器被变量 a 和变量 b接洽关系.当没须要时,php不会去复制已生成的变量容器。变量容器在”refcount“变成0时就被烧毁. 当任何接洽关系到某个变量容器的变量分开它的感化域(比如:函数履行停止),或者对变量调用了函数 unset()时,”refcount“就会减1,下面的例子就能解释:
例4 削减引用计数
- <?php
- $a = "new string";
- $c = $b = $a;
- xdebug_debug_zval( 'a' );
- unset( $b, $c );
- xdebug_debug_zval( 'a' );
- ?>
以上例程会输出:
如不雅我们如今履行 unset($a);,包含类型和值的┞封个变量容器就会大年夜内存中删除。
复合类型(Compound Types)
当推敲像 array和object如许的复合类型时,工作就稍微有点复杂. 与 标量(scalar)类型的值不合,array和 object类型的变量把它们的成员或属性存在本身的符号表中。这意味着下面的例子将生成三个zval变量容器。
推荐阅读
阿里巴巴发布AliGenie语音开放平台 “智联网”战略又落一子
10月12日消息,在2017杭州•云栖大年夜会上,阿里巴巴人工智能实验室宣布了AliGenie 开放平台,重要包含三大年夜部分:精灵技能市场、硬件开放平台、行业解决筹划,周全赋能智能家居、>>>详细阅读
本文标题:PHP的垃圾回收机制——引用计数
地址:http://www.17bianji.com/lsqh/37855.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示