我想了解这篇文章“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)=...
)
答案 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/>';