最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP對象相互引用的內存溢出實例分析

 更新時間:2014年08月28日 10:20:45   投稿:shichen2014  
這篇文章主要介紹了PHP對象相互引用的內存溢出實例分析,是PHP5.3以下版本中常見的一個bug,文中給出了解決方法,需要的朋友可以參考下

通常來說使用腳本語言最大的好處之一就是可利用其擁有的自動垃圾回收機制來釋放內存。你不需要在使用完變量后做任何釋放內存的處理,因為這些PHP會幫你完成。
當然,我們可以按自己的意愿調用 unset() 函數(shù)來釋放內存,但通常不需要這么做。
不過在PHP里,至少有一種情況內存不會得到自動釋放,即便是手動調用 unset()。詳情可考PHP官網(wǎng)關于內存泄露的分析:http://bugs.php.net/bug.php?id=33595。

問題癥狀如下:

如果兩個對象之間存在著相互引用的關系,如“父對象-子對象”,對父對象調用 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()) . " ";
}
?>

運行這段代碼,你會看到內存使用率越來越高越來越高,直到用光光。

...33,551,61633,551,97633,552,33633,552,696PHP Fatal error: Allowed memory size of 33554432 bytes exhausted(tried to allocate 16 bytes) in memleak.php on line 17

對大部分PHP程序員來講這種情況不算是什么問題??扇绻阍谝粋€長期運行的代碼中使用到了一大堆相互引用的對象,尤其是在對象相對較大的情況下,內存會迅速地消耗殆盡。

Userland解決方案

雖然有些乏味、不優(yōu)雅,但之前提到的 bugs.php.net 鏈接中提供了一個解決方案。
這個方案在釋放對象前使用一個 destructor 方法以達到目的。Destructor 方法可將所有內部的父對象引用全部清除,也就是說可以將這部分本來會溢出的內存釋放掉。

以下是“修復后”的代碼:

<?
phpclass Foo {
 function __construct(){
 $this->bar = new Bar($this);
 }
 function __destruct(){
 unset($this->bar);
 }
}
class Bar {
 function __construct($foo = null){
 $this->foo = $foo;
 }
}
while (true) {
 $foo = new Foo();
 $foo->__destruct();
 unset($foo);
 echo number_format(memory_get_usage()) . " ";
}
?>

注意那個新增的Foo::__destruct()方法,以及在釋放對象前對 $foo->__destruct() 的調用?,F(xiàn)在這段代碼解決了內存使用率一直增加的問題,這么一來,代碼就可以很好的工作了。

PHP內核解決方案

為什么會有內存溢出的發(fā)生?我對PHP內核方面的研究并不精通,但可以確定的是此問題與引用計數(shù)有關系。
在 $bar 中引用 $foo 的引用計數(shù)不會因為父對象 $foo 被釋放而遞減,這時PHP認為你仍需要 $foo 對象,也就不會釋放這部分的內存。原理大致如此。

通俗的來說,大體意思是:一個引用計數(shù)沒有遞減,所以一些內存永遠得不到釋放。
此外在前面提到的 bugs.php.net 鏈接中指出了修改垃圾回收的過程將會犧牲極大的性能,需要讀者對此注意。

與其改變垃圾回收的過程,為什么不用 unset() 對內部對象做釋放的工作呢?(或者在釋放對象的時候調用 __destruct()?)
也許PHP內核開發(fā)者可以在此或其他地方,對這種垃圾回收處理機制做出修改。

相信本文所述對大家深入理解PHP運行原理有所幫助。

相關文章

  • php獲取json數(shù)據(jù)所有的節(jié)點路徑

    php獲取json數(shù)據(jù)所有的節(jié)點路徑

    這篇文章主要介紹了php獲取json數(shù)據(jù)所有的節(jié)點路徑的方法和實例,有需要的小伙伴可以參考下。
    2015-05-05
  • PHP+MySQL實現(xiàn)的簡單投票系統(tǒng)實例

    PHP+MySQL實現(xiàn)的簡單投票系統(tǒng)實例

    這篇文章主要介紹了PHP+MySQL實現(xiàn)的簡單投票系統(tǒng),以完整實例形式分析了PHP+MySQL實現(xiàn)投票功能的具體功能代碼與相關技巧,需要的朋友可以參考下
    2016-02-02
  • 從PHP的源碼中深入了解stdClass類

    從PHP的源碼中深入了解stdClass類

    這篇文章主要介紹了從分析PHP的源碼角度深入了解stdClass類,并總結了stdClass類到底是是什么,需要的朋友可以參考下
    2014-04-04
  • PHP __autoload函數(shù)(自動載入類文件)的使用方法

    PHP __autoload函數(shù)(自動載入類文件)的使用方法

    在使用PHP的OO模式開發(fā)系統(tǒng)時,通常大家習慣上將每個類的實現(xiàn)都存放在一個單獨的文件里,這樣會很容易實現(xiàn)對類進行復用,同時將來維護時也很便利
    2012-02-02
  • PHP常用header頭定義代碼示例匯總

    PHP常用header頭定義代碼示例匯總

    這篇文章主要介紹了PHP常用header頭定義代碼示例匯總,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • PHPStrom中實用的功能和快捷鍵大全

    PHPStrom中實用的功能和快捷鍵大全

    jetbrains出的PHPStrom很大程度上方便了PHP程序的編寫,下面小編給大家總結些PHPStrom中實用的功能和快捷鍵大全,在編寫的過程中變得又舒服又快捷,感興趣的朋友一起看看吧
    2015-09-09
  • 優(yōu)化PHP程序的方法小結

    優(yōu)化PHP程序的方法小結

    優(yōu)化PHP程序的方法小結,學習php的朋友可以參考下
    2012-02-02
  • php格式化電話號碼的方法

    php格式化電話號碼的方法

    這篇文章主要介紹了php格式化電話號碼的方法,涉及php正則表達式的相關技巧,需要的朋友可以參考下
    2015-04-04
  • PHP面向對象程序設計實例分析

    PHP面向對象程序設計實例分析

    這篇文章主要介紹了PHP面向對象程序設計的方法,結合實例形式分析了PHP面向對象程序設計中類的聲明與實例化及類中方法的調用技巧,需要的朋友可以參考下
    2016-01-01
  • php如何獲取Http請求

    php如何獲取Http請求

    在本篇文章里小編給大家分享的是關于php獲取Http請求的方法以及實例代碼,需要的朋友們學習下。
    2020-04-04

最新評論

多伦县| 津市市| 二手房| 曲阳县| 兴城市| 木兰县| 齐齐哈尔市| 黎城县| 南投市| 罗城| 雷波县| 阳山县| 蓬安县| 赤水市| 吴忠市| 蒙城县| 合作市| 崇阳县| 南昌县| 北宁市| 三亚市| 文水县| 延津县| 卓尼县| 清水河县| 石屏县| 永平县| 衢州市| 丹阳市| 新安县| 皋兰县| 宁河县| 肇州县| 休宁县| 斗六市| 民丰县| 衡水市| 阿图什市| 镇宁| 寻乌县| 方山县|