2011-11-19 52 views
1

可能重复:
Is there garbage collection in PHP?内存在PHP处理和Java

在java中有一个叫Garbage Collector概念。在java中,当一个对象无法从任何活动线程或任何静态引用到达时,对象就变成垃圾收集的合格对象,换句话说,如果一个对象的所有引用都为空,就可以说对象有资格进行垃圾回收。

PHP会发生什么?会导致内存溢出吗?这是PHP的劣势,还是有办法处理,以及PHP提供哪些方法和技术来有效处理内存?

+0

现在我只是意识到这是一个明确的重复。所以我会投票结束。 – markus

回答

3

PHP确实有一个垃圾收集器,但在PHP 5.3(5.2?)之前,它无法处理循环引用,并且无法对某些GC进行构造。例如

$ a = & $ a;

会导致内存泄漏。 PHP不会运行GC,除非它必须,因为GC运行很昂贵,并且通常不需要,因为大多数PHP脚本都是短暂的。只有当内存压力存在时,GC才会启动,并且只有当足够的内存根本无法释放时才会出现OOM错误。

2

PHP也会进行垃圾回收,事实上,在PHP中,你很少必须考虑内存。在PHP 5.3中垃圾收集已经大大改善。请阅读PHP manual

4

最重要的是关于php,它有基于引用计数的GC。见例如:

$a = 8; 
unset($a); //memory free 

$a = 8; 
$b = &$a; //or even $b = $a, see below 
unset($a); //memory unchanged 

和PHP链路上的所有数据在对方,但是更改前:

$a = 8; 
$b = $a; //we use memory only for $a 
$b++; //now we use twice more memory 

这对脚本语言的一个好办法,因为你可以在你的应用程序的不同层之间传递对象(例如,在MVC中以这种方式移动数据M-> C-> V),并且不要考虑指针或内存使用情况。

但是,如果你水木清华这样的(例如,从docs):

$a = array('one'); 
$a[] =& $a; 

您将无法清理的记忆力。这是典型的情况,当我们在MVC中有一些主要粘合类application时,存储在每个对象中。在这种情况下,我们将无法使用clean up内存。但是,对于生命周期为几ms的脚本语言来说,这并不重要。

+1

PHP 5.3应该能够释放最后一个例子中的内存。 –

+0

谢谢,我会在星期一做一个测试。 – Oroboros102

+0

对不起,对于迟到的答案,但我现在不使用php。浏览文档。你仍然可以依靠我的答案,afaik。很多工作是在PHP引擎内部完成的,但引用计数GC的基本功能保持不变。 – Oroboros102