php中的引用计数 - 它是如何工作的?

时间:2014-02-02 18:03:06

标签: php garbage-collection

我想了解这篇文章“PHP Manual -> Features -> Garbage Collection” 不幸的是,对我来说很少有事情不清楚。

1

  

避免每次都要调用垃圾循环检查   可能减少引用计数,算法改为全部   “根缓冲区”中可能的根(zvals)。

但是以防万一

<?php
$a = new \stdClass(); (1)
$a = new \stdClass();

然后我猜第一个对象变成了“丢失”的zval,如

  

no_symbol :( refcount = 1,is_ref = 1)= stdObject

这些“丢失”的zval是否会被添加到根缓冲区中?他们没有处理程序。

2

在功能范围内创建的变量,它们发生了什么? 例如:

<?php
function test($a = 'abc') {
    $c = 123;

    return 1; 
}

test(); 
echo 'end';

当gc启动时,$ a和$ c发生了什么? 这些变量仍将refcount设置为1。 他们还会被删除吗?如果是,那么为什么以及如何(封面下发生了什么?)

3。 它如何帮助循环引用?
实施例

<?php
$a = array('abc');
$a[] =& $a;
unset($a);

其中

(refcount=1, is_ref=1)=array (
   0 => (refcount=1, is_ref=0)='abc',
   1 => (refcount=1, is_ref=1)=...
)

1 个答案:

答案 0 :(得分:1)

1)原始对象被替换为新对象,因此可以立即释放内存。

echo memory_get_usage().'<br/>';
$a = new stdClass();
echo memory_get_usage().'<br/>';
$a = new stdClass();
echo memory_get_usage().'<br/>';

2)它们是函数完成执行的第二个gc'ed:

echo memory_get_usage().'<br/>';
function test($a = 'abc') {
    $c = 123;

    return 1;
}
echo memory_get_usage().'<br/>';
test();
echo memory_get_usage().'<br/>';

3)取消设置$ a会将引用的变量保留在内存中。您需要先将值设置为NULL,然后取消设置。

echo memory_get_usage().'<br/>';
$a = array('abc');
echo memory_get_usage().'<br/>';
$a[] =& $a;
echo memory_get_usage().'<br/>';
$a = null;
unset($a);
echo memory_get_usage().'<br/>';