php垃圾处理机制

前言:

大于等于php5.3.0以上才有垃圾处理机制 (GC)

这是官方手册所说:《每个php变量存在一个叫"zval"的变量容器中。一个zval变量容器,除了包含变量的类型和值,还包括两个字节的额外信息。第一个是"is_ref",是个bool值,用来标识这个变量是否是属于引用集合(reference set)。通过这个字节,php引擎才能把普通变量和引用变量区分开来,由于php允许用户通过使用&来使用自定义引用,zval变量容器中还有一个内部引用计数机制,来优化内存使用。第二个额外字节是"refcount",用以表示指向这个zval变量容器的变量(也称符号即symbol)个数。所有的符号存在一个符号表中,其中每个符号都有作用域(scope),那些主脚本(比如:通过浏览器请求的的脚本)和每个函数或者方法也都有作用域。》

其实我的理解就是php每次定义一个新的变量就会产生新的zval容器

<?php
$sea = "sea24";

xdebug_debug_zval('sea');
?>

就会输出

sea: (refcount=1, is_ref=0)='sea'
其实我的理解就是php每次定义一个新的变量就会产生新的zval容器
refcount:意思就是把一个变量赋值给另一变量将增加引用次数(refcount).

只有删除当前定义的变量容器比如unset(); refcount才会减一,

内存占用空间节省

首先,实现垃圾回收机制的整个原因是为了,一旦先决条件满足,通过清理循环引用的变量来节省内存占用。在PHP执行中,一旦根缓冲区满了或者调用gc_collect_cycles() 函数时,就会执行垃圾回收。在下图中,显示了下面脚本分别在PHP 5.2 和 PHP 5.3环境下的内存占用情况,其中排除了脚本启动时PHP本身占用的基本内存。

 

 


posted @ 2018-12-21 11:33  sea24  阅读(317)  评论(0编辑  收藏  举报