php数据回收,php内存回收

什么是php垃圾回收机制

以下摘自网络:

站在用户的角度思考问题,与客户深入沟通,找到本溪网站设计与本溪网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:网站建设、成都网站建设、企业官网、英文网站、手机端网站、网站推广、空间域名、雅安服务器托管、企业邮箱。业务覆盖本溪地区。

对象引用计数器机制回收:

php 5.3之前使用的垃圾回收机制是单纯的“引用计数”,也就是每个内存对象都分配一个计数器,当内存对象被变量引用时,计数器+1;当变量引用撤掉后,计数器-1;当计数器=0时,表明内存对象没有被使用,该内存对象则进行销毁,垃圾回收完成。

“引用计数”存在问题,就是当两个或多个对象互相引用形成环状后,内存对象的计数器则不会消减为0;这时候,这一组内存对象已经没用了,但是不能回收,从而导致内存泄露。

php5.3开始,使用了新的垃圾回收机制,在引用计数基础上,实现了一种复杂的算法,来检测内存对象中引用环的存在,以避免内存泄露。

示例代码:

class A{

private $b;

function __construct(){

$this-b = new B($this);

}

function __destruct(){

//echo "A destruct\n";

}

function out(){

echo 'oooo',"\n";

}

}

class B{

private $a;

function __construct($a){

$this-a = $a;

}

function __destruct(){

//echo "B descturct\n";

}

}

for($i=0;;$i++){

$a = new A();

if($i00 == 0){

echo memory_get_usage()."\n";

}

}

引起计数器+1的操作:

$a=new A();

$b=$a;

引起计数器-1的操作:

unset($a);

引起计数器值0对象并释放内存:

$a=null;

内存相关的函数:

memory_get_usage()返回当前分配给你的 PHP 脚本的内存量,单位是字节(byte)

memory_get_peak_usage()返回分配给 PHP 内存的峰值

mysql_free_result() 手动释放mysql结果集内存

gc_enable();//开启gc自动回收

gc_collect_cycles();//执行一次回收周期

gc_disable();//关闭gc自动回收周期

xdebug_debug_zval(变量名)//加载完xdebug后,可以用这个函数查看变量的状态

请采纳!

PHP垃圾回收之变量的处理及如何进行垃圾回收

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

zval容器保存了此变量的类型type,值value,还有其它二块东西。

其中一个叫做”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)来建表的。

php的垃圾回收机制

当数据进行unset时,引用计数减一后仍然不为0,才会开始垃圾回收。

php7以后,进行了优化,对于一些标量类型,bool、int、字符串,不存在引用导致的回收。

下面来讲垃圾回收(分为垃圾收集器和垃圾回收算法。)

只有在循环引用的情况,才会产生垃圾。所以用到垃圾回收的只有数组和对象。

当数组或对象,unset后,zval数据引用仍大于零将会进入垃圾收集的缓冲区。

当缓冲区的数量到配置值时(默认1万个节点)开始执行垃圾回收算法。

就是将缓冲区内的所有数据,深度遍历,模拟删除。每一个数组内的子值都要删除操作。

模拟删除后,如果引用计数为0了,认为是垃圾。不为0,则还有在使用。


分享文章:php数据回收,php内存回收
路径分享:http://pwwzsj.com/article/hspegs.html