免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

PHP中怎么實現(xiàn)垃圾回收機制

這篇文章將為大家詳細(xì)講解有關(guān)PHP中怎么實現(xiàn)垃圾回收機制,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

為東洲等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及東洲網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為做網(wǎng)站、網(wǎng)站設(shè)計、東洲網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!

一、PHP 中的引用計數(shù)

1.1 如何確定垃圾

原理:給對象添加一個引用計數(shù)器,每當(dāng)有一個地方引用它,計數(shù)器的值就加一。每當(dāng)有一個引用失效,計數(shù)器的值就減一。

  • 如果一個變量 value 的 refcount 減一之后等于 0,此 value 可以被釋放掉,不屬于垃圾。垃圾回收器不會處理

  • 如果一個變量 value 的 refcount 減一之后還是大于 0,此 value 被認(rèn)為不能被釋放掉,可能成為一個垃圾。

  • 垃圾回收器將可能的垃圾收集起來,等達(dá)到一定數(shù)量后開始啟動垃圾鑒定程序,把真正的垃圾釋放掉。

缺點:需要維護(hù)引用計數(shù)器,有一定的消耗。且較難處理循環(huán)引用的問題。后面也會講到如何解決這個問題。

下面的例子說明引用計數(shù)的是如何變化的:

PHP中怎么實現(xiàn)垃圾回收機制

1.2 PHP 中的變量知識

每個 php 變量存在一個叫 zval 的變量容器中。一個 zval 變量容器,除了包含變量的類型和值,還包括兩個字節(jié)的額外信息。

第一個是 is_ref,是個 bool 值,用來標(biāo)識這個變量是否是屬于引用集合(reference set) 。通過這個字節(jié),php 引擎才能把普通變量和引用變量區(qū)分開來,由于 php 允許用戶通過使用&來使用自定義引用,zval 變量容器中還有一個內(nèi)部引用計數(shù)機制,來優(yōu)化內(nèi)存使用。

第二個額外字節(jié)是 refcount,用以表示指向這個 zval 變量容器的變量(也稱符號即 symbol )個數(shù)。

1.3 使用引用計數(shù)的類型

有 5 種類型用的引用計數(shù):

string、array、object、resource、reference

下面的表格說明了只有 type_flag 為以下 8 種類型且 IS_TYPE_REFOUNTED=true 的變量才使用引用計數(shù),如下表所示

PHP中怎么實現(xiàn)垃圾回收機制

二、回收原理

2.1. 回收時機

  • 自動回收:在變量 zval 斷開 value 的指向時,如果發(fā)現(xiàn) refcount=0 則會直接釋放 value。

    • 修改變量時會斷開原有 value 的指向

    • 函數(shù)返回時會釋放所有的局部變量

    • 斷開 value 指向的情形

  • 主動回收

    調(diào)用 unset() 函數(shù)。類似于 Java 中的 System.gc()

2.2 垃圾鑒定

垃圾收集器收集的可能垃圾到達(dá)一定數(shù)量后,啟動垃圾鑒定、回收程序。

原理:垃圾是由于成員引用自身導(dǎo)致的,那么就對 value 的 refcount 減一操作,如果 value 的 refount 變?yōu)榱?0,則表明其引用全部來自自身成員,value 屬于垃圾。另外垃圾只會出現(xiàn)在array、object類型中。

PHP中怎么實現(xiàn)垃圾回收機制

  • 步驟一:遍歷垃圾回收器的 buffer 緩沖區(qū),把 value 標(biāo)為灰色,把 value 的成員的 refount-1,還是標(biāo)為灰色。

  • 步驟二:遍歷垃圾回收器的 buffer 緩沖區(qū),如果 value 的 refcount 等于 0,標(biāo)為白色,認(rèn)為是垃圾;如果不等于 0,則表示還有外部的引用,不是垃圾,將 refcount+1 還原回去,標(biāo)為黑色。

  • 步驟三:遍歷垃圾回收器的 buffer 緩沖區(qū),將 value 為非白色的節(jié)點從 buffer 中刪除,最終 buffer 緩沖區(qū)中都是真正的垃圾。

  • 步驟四:遍歷垃圾回收器的 buffer 緩沖區(qū),釋放此 value。

三、帶你看源碼

1. 垃圾管家

我稱 _zend_gc_globals 為垃圾管家,結(jié)構(gòu)體會對垃圾進(jìn)行管理,收集到的可能成為垃圾的 value 就保存在這個結(jié)構(gòu)的 buf 中,稱為垃圾緩存區(qū)。

文件路徑:\Zend\zend_gc.h。

PHP中怎么實現(xiàn)垃圾回收機制

2. 垃圾管家初始化

(1)php.ini 解析后調(diào)用 gc_init() 初始垃圾管家_zend_gc_globals

文件路徑:\Zend\zend_gc.c

PHP中怎么實現(xiàn)垃圾回收機制

(2)gc_init() 函數(shù)里面調(diào)用 gc_reset() 函數(shù)初始化。

PHP中怎么實現(xiàn)垃圾回收機制

3. 判斷是否需要收集

(1)在銷毀一個變量時就會判斷是否需要收集。調(diào)用 i_zval_ptr_dtor() 函數(shù)

文件路徑:Zend\zend_variables.h

PHP中怎么實現(xiàn)垃圾回收機制

  • 如果 refcount 減一后,refcount 等于 0,則認(rèn)為不是垃圾,調(diào)用 _zval_dtor_func 方法釋放此 value。

  • 如果 refcount 減一后,refcount 大于 0,則認(rèn)為 value 可能是垃圾,垃圾管家進(jìn)行收集

3. 收集垃圾

文件路徑:\Zend\zend_gc.c,調(diào)用方法:gc_possible_root

PHP中怎么實現(xiàn)垃圾回收機制

  • 拿出 unused 指向的節(jié)點。

  • 如果拿出的節(jié)點是可用的,則將 unused 指向下一個節(jié)點。

  • 如果 unused 沒有可用的,且 first_unused 還沒有推進(jìn)到 last_unused,則表示 buf 緩存區(qū)中還有可用的節(jié)點。

  • 拿出 first_unused 指向的節(jié)點。

  • first_unused 指向下一個節(jié)點。

  • buf 緩存區(qū)已滿,啟動垃圾鑒定、垃圾回收。

  • 如果未啟用垃圾回收,則直接返回。

PHP中怎么實現(xiàn)垃圾回收機制

  • 將插入的變量標(biāo)為紫色,防止重復(fù)插入。

  • 將該節(jié)點在 buf 數(shù)組中的位置保存到了 gc_info 中,當(dāng)后續(xù) value 的 refcount 變?yōu)榱?0。

  • 需要將其從 buf 中刪除時可以知道該 value 保存在哪個 gc_root_buffer 中。

5. 釋放垃圾

由于回收方法 zend_gc_collect_cycles() 實在是太長,我把幾個關(guān)鍵步驟理出來了:

PHP中怎么實現(xiàn)垃圾回收機制

  • 掃描根節(jié)點

  • 收集根節(jié)點

  • 調(diào)用回收器

  • 清理變量

  • 收集完成

關(guān)于PHP中怎么實現(xiàn)垃圾回收機制就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

網(wǎng)站題目:PHP中怎么實現(xiàn)垃圾回收機制
分享路徑:http://m.newbst.com/article40/pjceeo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)網(wǎng)站內(nèi)鏈外貿(mào)網(wǎng)站建設(shè)品牌網(wǎng)站制作微信小程序

廣告

聲明:本網(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)

成都做網(wǎng)站