文章分析的是PHP内核解决循环引用问题的方式,另外JVM使用的是一种叫可达性分析的算法(从GC Roots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。不可达对象。),两种方法有异曲同工之妙。
先看下面这样一段代码
<?php
$a = array('one');
$a[] = &$a;
unset($a);
?>
如果使用最原始的引用计数,$a这个结构的refcount是2, 使用unset之后refcount-1, 但是代码已经没有变量指向这个结构了,也就是说我们无法访问到array(‘one’), 但是这个结构依然占用着内存, 所以即便此刻我们拥有手动释放内存的能力,也无法去释放这块“野内存“, 出现了内存泄露。
我们来看看php5.3新的zend引擎是如何解决这种情况下的内存泄露。
优点: 可以解决循环引用导致的内存泄露问题。 缺点: 在root buffer满了的时候会启用GC扫描,性能会有一定的损失,但是可以接受。
评论
暂无评论~~