成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

PHP垃圾回收機(jī)制

luck / 1915人閱讀

摘要:在中算法,當(dāng)節(jié)點(diǎn)緩沖區(qū)滿了之后,垃圾分析算法就會(huì)啟動(dòng),并且會(huì)釋放掉發(fā)現(xiàn)的垃圾,從而回收內(nèi)存。在編程中程序員不需要手動(dòng)處理內(nèi)存資源分配與釋放,意味著本身實(shí)現(xiàn)了垃圾回收處理機(jī)制。

PHP是一種弱類型的腳本語(yǔ)言,弱類型不表示PHP變量沒(méi)有類型的區(qū)別,PHP變量有8種原始類型:
四種標(biāo)量類型:

boolean(布爾值)

integer(整型)

float(浮點(diǎn)型)

兩種復(fù)合類型:

array(數(shù)組)

object(對(duì)象)

兩種特殊類型:

resource(資源)

NULL


在引擎內(nèi)部,變量都是用一個(gè)結(jié)構(gòu)體來(lái)表示的。這個(gè)結(jié)構(gòu)體可以在{PHPSRC}/Zend/zend.h中找到:

  struct _zval_struct {  
       /* Variable information */  
       zvalue_value value;     /* value */  
       zend_uint refcount__gc;  //代表一個(gè)計(jì)數(shù)器,表示有多少個(gè)變量名指向這個(gè)zval容器
       zend_uchar type;    /* active type */  
       zend_uchar is_ref__gc;  //此字段是一個(gè)布爾值,用來(lái)標(biāo)識(shí)變量是否是一個(gè)引用,通過(guò)這個(gè)字段,PHP引擎可以區(qū)分一般變量和引用變量
   };  
copy on write(寫時(shí)復(fù)制技術(shù))
父進(jìn)程fork子進(jìn)程之后,子進(jìn)程的地址空間還是簡(jiǎn)單的指向父進(jìn)程的地址空間,只有當(dāng)子進(jìn)程需要寫地址空間中的內(nèi)容的時(shí)候,才會(huì)多帶帶分離一份給子進(jìn)程,這樣就算子進(jìn)程馬上調(diào)用exec函數(shù)也沒(méi)有關(guān)系,因?yàn)楦揪筒恍枰獜母高M(jìn)程的地址空間中拷貝內(nèi)容,這樣就節(jié)省了內(nèi)存同時(shí)又提高了速度。

這個(gè)邏輯可以敘述為:對(duì)一個(gè)一般變量a(isref=0)進(jìn)行一般的賦值操作,如果a所指向的zval的計(jì)數(shù)refcount大于1,那么需要為a重新分配一個(gè)新的zval,并且把之前的zval的計(jì)數(shù)refcount減少1。

PHP5.3版本中對(duì)于新的GC算法(Concurrent Cycle Collection in Reference Counted Systems)

幾個(gè)基本準(zhǔn)則:

如果一個(gè)zval的refcount增加,那么此zval還在使用,不屬于垃圾

如果一個(gè)zval的refcount減少到0,那么zval可以被釋放掉,不屬于垃圾

如果一個(gè)zval的refcount減少之后大于0,那么此zval還不能被釋放,此zval可能成為一個(gè)垃圾。

新的GC算法目的就是防止循環(huán)引用的變量引起內(nèi)存泄露問(wèn)題。在PHP中GC算法,當(dāng)節(jié)點(diǎn)緩沖區(qū)滿了之后,垃圾分析算法就會(huì)啟動(dòng),并且會(huì)釋放掉發(fā)現(xiàn)的垃圾,從而回收內(nèi)存。

現(xiàn)在,如果我們?cè)囈幌?,將?shù)組的引用賦值給數(shù)組中的一個(gè)元素,有意思的事情發(fā)生了:

這樣$a數(shù)組就有兩個(gè)元素,一個(gè)索引為0,值為字符one,另一個(gè)索引為1,為$a自身的引用,內(nèi)部存儲(chǔ)如下:

a: (refcount=2, is_ref=1)=array (
   0 => (refcount=1, is_ref=0)="one",
   1 => (refcount=2, is_ref=1)=...
)

“...”表示1指向a自身,是一個(gè)環(huán)形引用(循環(huán)引用):

這個(gè)時(shí)候我們對(duì)$a進(jìn)行unset,那么$a會(huì)從符號(hào)表中刪除,同時(shí)$a指向的zval的refcount減少1。

那么問(wèn)題產(chǎn)生了,$a已經(jīng)不再符號(hào)表中了,用戶無(wú)法再訪問(wèn)此變量,但是$a之前指向的zval的refcount變?yōu)?而不是0,因此不能被回收,這樣產(chǎn)生了內(nèi)存泄露:

這樣zval就成為一個(gè)垃圾了,新的GC要做的工作就是清理這種垃圾。

在PHP編程中程序員不需要手動(dòng)處理內(nèi)存資源分配與釋放,意味著PHP本身實(shí)現(xiàn)了垃圾回收處理機(jī)制。
PHP5.2中的垃圾回收算法---Reference Counting
這個(gè)算法叫做“引用計(jì)數(shù)”,其思想非常直觀和簡(jiǎn)潔:為每個(gè)內(nèi)存對(duì)象分配一個(gè)計(jì)數(shù)器,當(dāng)一個(gè)內(nèi)存對(duì)象建立時(shí)計(jì)數(shù)器初始化為1(因此此時(shí)總是有一個(gè)變量引用此對(duì)象),以后每有一個(gè)新變量引用此內(nèi)存對(duì)象,則計(jì)數(shù)器加1,而每當(dāng)減少一個(gè)引用此內(nèi)存對(duì)象的變量則計(jì)數(shù)器減1,當(dāng)垃圾回收機(jī)制運(yùn)作時(shí),將所有計(jì)數(shù)器為0的內(nèi)存對(duì)象銷毀并回收其占用的內(nèi)存。而php中內(nèi)存對(duì)象就是zval,而計(jì)數(shù)器就是refcount__gc。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/28431.html

相關(guān)文章

  • PHP回收周期

    摘要:原文回收周期,增加一篇論文在底部。就是說(shuō),僅僅在引用計(jì)數(shù)減少到非零值時(shí),才會(huì)產(chǎn)生垃圾周期。如果他們是循環(huán)引用周期的一部分,將永不能被清除進(jìn)而導(dǎo)致內(nèi)存泄漏。這個(gè)函數(shù)將返回使用這個(gè)算法回收的周期數(shù)。引用計(jì)數(shù)系統(tǒng)中的同步周期回收 原文:回收周期(Collecting Cycles) ,增加一篇論文在底部。 以下過(guò)程僅對(duì)數(shù)組和對(duì)象類型起作用。 傳統(tǒng)上,像以前的 php 用到的引用計(jì)數(shù)內(nèi)存機(jī)制,...

    Astrian 評(píng)論0 收藏0
  • php底層原理之垃圾回收機(jī)制

    摘要:總結(jié)垃圾回收機(jī)制以的引用計(jì)數(shù)機(jī)制為基礎(chǔ)以前只有該機(jī)制同時(shí)使用根緩沖區(qū)機(jī)制,當(dāng)發(fā)現(xiàn)有存在循環(huán)引用的時(shí),就會(huì)把其投入到根緩沖區(qū),當(dāng)根緩沖區(qū)達(dá)到配置文件中的指定數(shù)量后,就會(huì)進(jìn)行垃圾回收,以此解決循環(huán)引用導(dǎo)致的內(nèi)存泄漏問(wèn)題開(kāi)始引入該機(jī)制 php垃圾回收機(jī)制,對(duì)于PHPer來(lái)說(shuō)是一個(gè)不陌生但是又不是很熟悉的內(nèi)容。那么php是怎么實(shí)現(xiàn)對(duì)不需要的內(nèi)存進(jìn)行回收的呢? php變量的內(nèi)部存儲(chǔ)結(jié)構(gòu) 首先還是...

    light 評(píng)論0 收藏0
  • 【轉(zhuǎn)】淺談PHP5中垃圾回收算法(Garbage Collection)的演化

    摘要:所有這些類型,在內(nèi)部統(tǒng)一用一個(gè)叫做的結(jié)構(gòu)表示,在源代碼中這個(gè)結(jié)構(gòu)名稱為。的具體定義在源代碼的文件中,下面是相關(guān)代碼的摘錄。 【轉(zhuǎn)】淺談PHP5中垃圾回收算法(Garbage Collection)的演化 前言 PHP是一門托管型語(yǔ)言,在PHP編程中程序員不需要手工處理內(nèi)存資源的分配與釋放(使用C編寫PHP或Zend擴(kuò)展除外),這就意味著PHP本身實(shí)現(xiàn)了垃圾回收機(jī)制(Garbage C...

    AdolphLWQ 評(píng)論0 收藏0
  • 帶你入門 JavaScript ES6 (五) 集合

    摘要:一概述集合是引入的新的內(nèi)置對(duì)象類型,其特點(diǎn)同數(shù)學(xué)意義的集合,即集合內(nèi)所有元素不重復(fù)元素唯一。數(shù)組集合對(duì)比數(shù)組和集合,數(shù)組可以加入重復(fù)數(shù)據(jù),而集合的所有元素是唯一的不允許重復(fù)。因此,適合臨時(shí)存放一組對(duì)象,以及存放跟對(duì)象綁定的信息。 本文同步帶你入門 帶你入門 JavaScript ES6 (五) 集合,轉(zhuǎn)載請(qǐng)注明出處。 前面我們學(xué)習(xí)了: for of 變量和擴(kuò)展語(yǔ)法 塊作用域變量和解構(gòu)...

    BetaRabbit 評(píng)論0 收藏0
  • PHP垃圾回收機(jī)制-引用計(jì)數(shù)基本知識(shí)(5.3)

    摘要:后者的例子在給巨大的一個(gè)知名的組件庫(kù)的模板組件做單元測(cè)試時(shí),就可能會(huì)出現(xiàn)問(wèn)題。 PHP的垃圾回收機(jī)制 垃圾回收器,全稱Garbage Collection,簡(jiǎn)稱GC,5.3版本之前 只是簡(jiǎn)單判斷變量的zval的refcount是否為0,是的話就釋放,不是直至進(jìn)程結(jié)束(隱藏著變量?jī)?nèi)存溢出的風(fēng)險(xiǎn)). 如果你已經(jīng)安裝了? Xdebug,你能通過(guò)調(diào)用函數(shù) xdebug_debug_zval()...

    dreambei 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<