掌握PHP垃圾回收機(jī)制詳解_第1頁(yè)
掌握PHP垃圾回收機(jī)制詳解_第2頁(yè)
掌握PHP垃圾回收機(jī)制詳解_第3頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第掌握PHP垃圾回收機(jī)制詳解php的垃圾回收機(jī)制可以簡(jiǎn)單總結(jié)為引用計(jì)數(shù)寫(xiě)時(shí)復(fù)制COW機(jī)制,

本文主要和大家分享掌握php垃圾回收機(jī)制的知識(shí),希望能幫助到大家。

引用計(jì)數(shù)基本知識(shí)

官網(wǎng)的解答如下每個(gè)php變量存在一個(gè)叫”zval”的變量容器中一個(gè)zval變量容器,除了包含變量的類(lèi)型和值,還包括兩個(gè)字節(jié)的額外信息is_ref和refcountis_ref是個(gè)bool值,用來(lái)標(biāo)識(shí)這個(gè)變量是否是屬于引用集合(referenceset)。通過(guò)這個(gè)字節(jié),php引擎才能把普通變量和引用變量區(qū)分開(kāi)來(lái)refcount用以表示指向這個(gè)zval變量容器的變量個(gè)數(shù)PHP5中的引用計(jì)數(shù)在PHP5中,zval的內(nèi)存是單獨(dú)從堆(heap)中分配的(有少數(shù)例外情況),PHP需要知道哪些zval是正在使用的,哪些是需要釋放的。所以這就需要用到引用計(jì)數(shù):zval中refcount__gc的值用于保存zval本身被引用的次數(shù),比如b=12語(yǔ)句中,12被兩個(gè)變量引用,所以它的引用計(jì)數(shù)就是2。如果引用計(jì)數(shù)變成0,就意味著這個(gè)變量已經(jīng)沒(méi)有用了,內(nèi)存也就可以釋放了。

如下:

php

//phpzval變量容器

$a=1;

$b=1;

$c=

$d=$b;

$e=range(0,3);

xdebug_debug_zval('a');

xdebug_debug_zval('b');

xdebug_debug_zval('c');

xdebug_debug_zval('d');

xdebug_debug_zval('e');

結(jié)果如下

a:(refcount=2,is_ref=1),int1b:(refcount=2,is_ref=0),int1c:(refcount=2,is_ref=1),int1d:(refcount=2,is_ref=0),int1e:(refcount=1,is_ref=0),array(size=4)0=(refcount=1,is_ref=0),int01=(refcount=1,is_ref=0),int12=(refcount=1,is_ref=0),int23=(refcount=1,is_ref=0),int3

每一個(gè)變量都記了自己的數(shù)PHP7中的zval在PHP7中zval有了新的實(shí)現(xiàn)方式。最基礎(chǔ)的變化就是zval需要的內(nèi)存不再是單獨(dú)從堆上分配,不再自己存儲(chǔ)引用計(jì)數(shù)。復(fù)雜數(shù)據(jù)類(lèi)型(比如字符串、數(shù)組和對(duì)象)的引用計(jì)數(shù)由其自身來(lái)存儲(chǔ)。這種實(shí)現(xiàn)方式有以下好處:簡(jiǎn)單數(shù)據(jù)類(lèi)型不需要單獨(dú)分配內(nèi)存,也不需要計(jì)數(shù)不會(huì)再有兩次計(jì)數(shù)的情況,在對(duì)象中,只有對(duì)象自身存儲(chǔ)的計(jì)數(shù)是有效的由于現(xiàn)在計(jì)數(shù)由數(shù)值自身存儲(chǔ),所以也就可以和非zval結(jié)構(gòu)的數(shù)據(jù)共享,比如zval和hashtablekey之間間接訪(fǎng)問(wèn)需要的指針數(shù)減少了

php

//phpzval變量容器

$a=1;

$b=1;

$c=

$d=$b;

$e=range(0,3);

xdebug_debug_zval('a');

xdebug_debug_zval('b');

xdebug_debug_zval('c');

xdebug_debug_zval('d');

xdebug_debug_zval('e');結(jié)果如下a:(refcount=2,is_ref=1)int1b:(refcount=0,is_ref=0)int1c:(refcount=2,is_ref=1)int1d:(refcount=0,is_ref=0)int1e:(refcount=1,is_ref=0)array(size=4)0=(refcount=0,is_ref=0)int01=(refcount=0,is_ref=0)int12=(refcount=0,is_ref=0)int23=(refcount=0,is_ref=0)int3

普通變量不再記自己的數(shù),數(shù)組這樣的復(fù)雜類(lèi)型記自己的數(shù)什么是垃圾只有在準(zhǔn)則3下,GC才會(huì)把zval收集起來(lái),然后通過(guò)新的算法來(lái)判斷此zval是否為垃圾。那么如何判斷這么一個(gè)變量是否為真正的垃圾呢?簡(jiǎn)單的說(shuō),就是對(duì)此zval中的每個(gè)元素進(jìn)行一次refcount減1操作,操作完成之后,如果zval的refcount=0,那么這個(gè)zval就是一個(gè)垃圾如果一個(gè)zval的refcount增加,那么此zval還在使用,不屬于垃圾如果一個(gè)zval的refcount減少到0,那么zval可以被釋放掉,不屬于垃圾如果一個(gè)zval的refcount減少之后大于0,那么此

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論