這篇文章主要為大家展示了“php如何引用計數(shù)實現(xiàn)垃圾回收”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“php如何引用計數(shù)實現(xiàn)垃圾回收”這篇文章吧。
創(chuàng)新互聯(lián)2013年至今,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元西崗做網(wǎng)站,已為上家服務(wù),為西崗各地企業(yè)和個人服務(wù),聯(lián)系電話:18980820575
1、實現(xiàn)說明
給對象添加引用計數(shù)器,每次在某個地方引用計數(shù)器的值都會增加。每當(dāng)引用失效時,計數(shù)器的值就會減一。
變量value的refcount減一后等于0的話,這個value就會被釋放,不是垃圾。垃圾回收器不處理。
變量value的refcount減一后大于0以上的話,這個value被認(rèn)為不能釋放,有可能成為垃圾。
垃圾回收器收集可能的垃圾,達到一定數(shù)量后啟動垃圾鑒定程序,釋放真正的垃圾。
2、實例
<?php // PHP垃圾回收機制案例: 參考php手冊 // --------------------標(biāo)量類型-------------------- // tip:每個php變量存在一個叫"zval"的變量容器中,該容器中包含變量的類型和值,"is_ref":是否是引用變量,"refcount":引用計數(shù) // ex:生成一個新的 zval容器 $a = 'new string'; // ex:顯示 zval容器 信息 xdebug_debug_zval('a'); // a:(refcount=1, is_ref=0),string 'new string' (length=10) // ex:增加 zval容器的引用計數(shù) $c = $b = $a; xdebug_debug_zval('a'); // a:(refcount=3, is_ref=0),string 'new string' (length=10) xdebug_debug_zval('b'); // b:(refcount=3, is_ref=0),string 'new string' (length=10) xdebug_debug_zval('c'); // c:(refcount=3, is_ref=0),string 'new string' (length=10) // tip:此時只有一個容器, 因為當(dāng)沒必要時,php不會去復(fù)制已生成的變量容器 // 此時這個變量容器被變量 a ,變量 b和變量c關(guān)聯(lián). unset($b); // ex:減少引用計數(shù) xdebug_debug_zval('a'); // a:(refcount=2, is_ref=0),string 'new string' (length=10) // tip:unset 刪除變量時,refcount 變量計數(shù)減一,此時只有$a,$b 指向該變量容器 unset($a); unset($c); var_dump($a); // tip:此時 recount為 0,變量被刪除 // 當(dāng)recount 變?yōu)?nbsp;0 時,包含類型和值的這個變量容器就會從內(nèi)存中刪除。 // --------------------復(fù)合類型-------------- echo '--------------復(fù)合類型------------<br/>'; $a = array( 'name' => 'junior', 'age' => 18 ); xdebug_debug_zval('a'); // a:(refcount=1, is_ref=0), // array (size=2) // 'name' => (refcount=1, is_ref=0),string 'junior' (length=6) // 'age' => (refcount=1, is_ref=0),int 18 // ex:添加一個已經(jīng)存在的元素到數(shù)組中 $a['love'] = $a['name']; xdebug_debug_zval('a'); // a:(refcount=1, is_ref=0), // array (size=3) // 'name' => (refcount=2, is_ref=0),string 'junior' (length=6) // 'age' => (refcount=1, is_ref=0),int 18 // 'love' => (refcount=2, is_ref=0),string 'junior' (length=6) // $a = array('one'); // xdebug_debug_zval('a'); // // $b = &$a; // $c = $a; // $b = &$c; // xdebug_debug_zval('b'); // xdebug_debug_zval('c'); // xdebug_debug_zval('a'); // 清理變量容器問題 echo '------------內(nèi)存泄漏問題-----------<br/>'; $a = array('one'); xdebug_debug_zval('a'); // a:(refcount=1, is_ref=0), // array (size=1) // 0 => (refcount=1, is_ref=0),string 'one' (length=3) $a[] = &$a; xdebug_debug_zval('a'); // a:(refcount=2, is_ref=1), // array (size=2) // 0 => (refcount=1, is_ref=0),string 'one' (length=3) // 1 => (refcount=2, is_ref=1), // &array // unset($a); // (refcount=1, is_ref=1)=array ( // 0 => (refcount=1, is_ref=0)='one', // 1 => (refcount=1, is_ref=1)=... // ) // tip: unset($a) 后引用計數(shù)減一,盡管不再有某個作用域中的任何符號指向這個結(jié)構(gòu)(就是變量容器), // 由于數(shù)組元素"1"仍然指向數(shù)組本身,所以這個容器不能被清除 // 因為沒有另外的符號指向它,用戶沒有辦法清除這個結(jié)構(gòu),結(jié)果就會導(dǎo)致內(nèi)存泄漏 // 慶幸的是, php將在腳本執(zhí)行結(jié)束時清除這個數(shù)據(jù)結(jié)構(gòu), 但是在php清除之前,將耗費不少內(nèi)存. // 同樣的情況也會發(fā)生在對象上,實際上對象更有可能出現(xiàn)這種情況,因為對象總是隱式的被引用。
以上是“php如何引用計數(shù)實現(xiàn)垃圾回收”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
分享文章:php如何引用計數(shù)實現(xiàn)垃圾回收
轉(zhuǎn)載注明:http://m.rwnh.cn/article20/phosco.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、企業(yè)網(wǎng)站制作、網(wǎng)站設(shè)計公司、域名注冊、、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)