PHP对象相互引用的内存溢出实例分析,是PHP5.3以下版本中常见的一个bug,文中给出了解决方法
通常来说使用脚本语言最大的好处之一就是可利用其拥有的自动垃圾回收机制来释放内存。你不需要在使用完变量后做任何释放内存的处理,因为这些PHP会帮你完成。
当然,我们可以按自己的意愿调用 unset() 函数来释放内存,但通常不需要这么做。
不过在PHP里,至少有一种情况内存不会得到自动释放,即便是手动调用 unset()。详情可考PHP官网关于内存泄露的分析.
问题症状如下:
如果两个对象之间存在着相互引用的关系,如“父对象-子对象”,对父对象调用 unset()不会释放在子对象中引用父对象的内存(即便父对象被垃圾回收,也不行)。
是不是有些糊涂了?我们来看下面的这段代码:
<?
phpclass Foo {
function __construct(){
$this->bar = new Bar($this);
}
}
class Bar {
function __construct($foo = null){
$this->foo = $foo;
}
}
while (true) {
$foo = new Foo();
unset($foo);
echo number_format(memory_get_usage()) . " ";
}
?>
评论列表()