在java中有一個叫Garbage Collector
概念。在java中,當一個對象無法從任何活動線程或任何靜態引用到達時,對象就變成垃圾收集的合格對象,換句話說,如果一個對象的所有引用都爲空,就可以說對象有資格進行垃圾回收。
PHP會發生什麼?會導致內存溢出嗎?這是PHP
的劣勢,還是有辦法處理,以及PHP
提供哪些方法和技術來有效處理內存?
在java中有一個叫Garbage Collector
概念。在java中,當一個對象無法從任何活動線程或任何靜態引用到達時,對象就變成垃圾收集的合格對象,換句話說,如果一個對象的所有引用都爲空,就可以說對象有資格進行垃圾回收。
PHP會發生什麼?會導致內存溢出嗎?這是PHP
的劣勢,還是有辦法處理,以及PHP
提供哪些方法和技術來有效處理內存?
PHP確實有一個垃圾收集器,但在PHP 5.3(5.2?)之前,它無法處理循環引用,並且無法對某些GC進行構造。例如
$ a = & $ a;
會導致內存泄漏。 PHP不會運行GC,除非它必須,因爲GC運行很昂貴,並且通常不需要,因爲大多數PHP腳本都是短暫的。只有當內存壓力存在時,GC纔會啓動,並且只有當足夠的內存根本無法釋放時纔會出現OOM錯誤。
PHP也會進行垃圾回收,事實上,在PHP中,你很少必須考慮內存。在PHP 5.3中垃圾收集已經大大改善。請閱讀PHP manual。
最重要的是關於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的腳本語言來說,這並不重要。
PHP 5.3應該能夠釋放最後一個例子中的內存。 –
謝謝,我會在星期一做一個測試。 – Oroboros102
對不起,對於遲到的答案,但我現在不使用php。瀏覽文檔。你仍然可以依靠我的答案,afaik。很多工作是在PHP引擎內部完成的,但引用計數GC的基本功能保持不變。 – Oroboros102
現在我只是意識到這是一個明確的重複。所以我會投票結束。 – markus