總結(jié)PHP內(nèi)存釋放以及垃圾回收
引用賦值
$a = 'apple'; $b = &$a;
上述代碼中,我將一個(gè)字符串賦值給變量a,然后將a的引用賦值給了變量b。顯然,這個(gè)時(shí)候的內(nèi)存指向應(yīng)該是這樣的:
$a -> 'apple' <- $b
a和b指向了同一塊內(nèi)存區(qū)域,我們通過(guò) var_dump($a, $b) 得到 string(5) "apple" string(5) "apple" ,這是我們預(yù)期的結(jié)果。
unset 函數(shù)
假如我想將 'apple' 這個(gè)字符串從內(nèi)存中釋放掉。我是這么做的:
unset($a);
但是通過(guò)再次打印 $a $b 兩變量的信息,我得到了這樣的結(jié)果:Notice: Undefined variable: a 和 string(5) "apple" 。奇怪,$a $b 同時(shí)指向一塊內(nèi)存區(qū)域,又明明將$a釋放了,為什么$b還是'apple'。
其實(shí)是這樣的,unset()這是將一個(gè)變量指針?shù)N毀了,并沒(méi)有釋放掉那塊內(nèi)存區(qū)域中存放的字符串,所以執(zhí)行完操作之后,內(nèi)存指向只是變成了這樣:
'apple' <- $b
要牢記重點(diǎn): unset()并沒(méi)有釋放變量所指向的那塊內(nèi)存,而只是將變量指針?shù)N毀了。同時(shí),將那塊內(nèi)存的 引用計(jì)數(shù) 減1,當(dāng)引用計(jì)數(shù)為0時(shí),也就是說(shuō)當(dāng)那塊內(nèi)存不被任何變量引用時(shí),便會(huì)觸發(fā)php的垃圾回收。
直接回收
那要怎樣做才能真正釋放掉 'apple' 所占用的內(nèi)存呢?
利用上述方法,我們可以在 unset($a) 之后再 unset($b) ,將內(nèi)存區(qū)域的所有引用都銷毀,引用計(jì)數(shù)減為0了,自然就被php回收了。
當(dāng)然,還有更直接的方法:
$a = null;
直接賦值 null 會(huì)將將 $a 所指向的內(nèi)存區(qū)域置空,并將引用計(jì)數(shù)歸零,內(nèi)存便被釋放。
腳本執(zhí)行結(jié)束
php是腳本語(yǔ)言,當(dāng)腳本執(zhí)行結(jié)束之后,腳本內(nèi)使用的所有內(nèi)存都會(huì)被釋放。
相關(guān)文章
Thinkphp框架開(kāi)發(fā)移動(dòng)端接口(2)
這篇文章主要介紹了thinkphp框架開(kāi)發(fā)移動(dòng)端接口的第2種方法,實(shí)現(xiàn)移動(dòng)端訪問(wèn)自動(dòng)切換移動(dòng)主題模板,從而實(shí)現(xiàn)偽app訪問(wèn),感興趣的小伙伴們可以參考一下2016-08-08解析linux下安裝memcacheq(mcq)全過(guò)程筆記
本篇文章是對(duì)linux下安裝memcacheq(mcq)全過(guò)程筆記進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06php7連接MySQL實(shí)現(xiàn)簡(jiǎn)易查詢程序的方法
這篇文章主要給大家介紹了關(guān)于php7連接MySQL實(shí)現(xiàn)簡(jiǎn)易查詢程序的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10php.ini?中文版?(PHP7,PHP8)?金步國(guó)
php.ini?中文版?(PHP7,PHP8),比較適合使用php7、php8的朋友使用,需要的朋友可以參考下2023-09-09php上傳文件并存儲(chǔ)到mysql數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了php上傳文件并存儲(chǔ)到mysql數(shù)據(jù)庫(kù)的方法,以完整實(shí)例形式較為詳細(xì)的分析了php操作文件上傳與數(shù)據(jù)庫(kù)存儲(chǔ)的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03