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