監(jiān)理公司管理系統(tǒng) | 工程企業(yè)管理系統(tǒng) | OA系統(tǒng) | ERP系統(tǒng) | 造價咨詢管理系統(tǒng) | 工程設(shè)計管理系統(tǒng) | 甲方項目管理系統(tǒng) | 簽約案例 | 客戶案例 | 在線試用
X 關(guān)閉
鷹潭網(wǎng)站建設(shè)公司

當前位置:工程項目OA系統(tǒng) > 泛普各地 > 江西OA系統(tǒng) > 鷹潭OA > 鷹潭網(wǎng)站建設(shè)公司

PHP 5中垃圾回收算法的演化

申請免費試用、咨詢電話:400-8352-114

鷹潭網(wǎng)站建設(shè)www.diyphp.net

PHP是一門保管型言語,在PHP編程中程序員不需求手工處置內(nèi)存資源的分配與開釋(運用C編寫PHP或Zend擴展在外),這就意味著PHP本身完結(jié)了廢物回收機制(Garbage Collection)。如今假若去PHP官方網(wǎng)站(php.net)可以看到,其時PHP5的兩個分支版別PHP5.2和PHP5.3是分別更新的,這是由于許多項目仍然運用5.2版另外PHP,而5.3版別對5.2并不是完全兼容。PHP5.3在PHP5.2的基礎(chǔ)上做了許多改善,其間廢物回收算法就歸于一個比較大的改動。本文將分別談?wù)揚HP5.2和PHP5.3的廢物回收機制,并談?wù)撨@種演化和改善關(guān)于程序員編寫PHP的影響以及要注重的問題。

  PHP變量及關(guān)聯(lián)內(nèi)存對象的內(nèi)部標明

  廢物回收說終究是對變量及其所關(guān)聯(lián)內(nèi)存對象的操作,所以在談?wù)揚HP的廢物回收機制之前,先簡明引見PHP中變量及其內(nèi)存對象的內(nèi)部標明(其C源代碼中的標明)。

  PHP官方文檔中將PHP中的變量劃分為兩類:標量類型和凌亂類型。標量類型包含布爾型、整型、浮點型和字符串;凌亂類型包含數(shù)組、對象和資源;還有一個NULL比較稀奇,它不劃分為任何類型,而是單獨成為一類。

  全部這些類型,在PHP內(nèi)部統(tǒng)一用一個叫做zval的結(jié)構(gòu)標明,在PHP源代碼中這個結(jié)構(gòu)名稱為“_zval_struct”。zval的具體定義在PHP源代碼的“Zend/zend.h”文件中,下面是關(guān)聯(lián)代碼的摘錄。

 

  typedef union _zvalue_value {

  long lval; /* long value */

  double dval; /* double value */

  struct {

  char *val;

  int len;

  } str;

  HashTable *ht; /* hash table value */

  zend_object_value obj;

  } zvalue_value;

  struct _zval_struct {

  /* Variable information */

  zvalue_value value;

  /* value */

  zend_uint refcount__gc;

  zend_uchar type; /* active type */

  zend_uchar is_ref__gc;

  };

 

  其間聯(lián)合體“_zvalue_value”用于標明PHP中全部變量的值,這里之所以運用union,是由于一個zval在一個時辰只能標明一種類型的變量??梢钥吹絖zvalue_value中只需5個字段,可是PHP中算上NULL有8種數(shù)據(jù)類型,那么PHP內(nèi)部是如何用5個字段標明8種類型呢?這算是PHP描繪比較美妙的一個當?shù)?,它始末復用字段達到了減少字段的目的。例如,在PHP內(nèi)部布爾型、整型及資源(只需存儲資源的標識符即可)都是始末lval字段存儲的;dval用于存儲浮點型;str存儲字符串;ht存儲數(shù)組(注重PHP中的數(shù)組其實是哈希表);而obj存儲對象類型;假若全部字段全部置為0或NULL則標明PHP中的NULL,這樣就達到了用5個字段存儲8種類型的值。

  而其時zval中的value(value的類型就是_zvalue_value)終究標明那種類型,則由“_zval_struct”中的type斷定。_zval_struct就是zval在C言語中的具體完結(jié),每個zval標明一個變量的內(nèi)存對象。除了value和type,可以看到_zval_struct中還有兩個字段refcount__gc和is_ref__gc,從其后綴就可以斷定這兩個家伙與廢物回收有關(guān)。沒錯,PHP的廢物回收全賴這倆字段了。其間refcount__gc標明其時有幾個變量引用此zval,而is_ref__gc標明其時zval能否被按引用引用,這話聽起來很拗口,這和PHP中zval的“Write-On-Copy”機制有關(guān),由于這個論題不是本文關(guān)鍵,因此這里不再臚陳,讀者只需記住refcount__gc這個字段的作用即可。

  PHP5.2中的廢物回收算法——Reference Counting

  PHP5.2中運用的內(nèi)存回收算法是大名鼎鼎的Reference Counting,這個算法中文翻譯叫做“引用計數(shù)”,其思想非常直觀和簡練:為每個內(nèi)存對象分配一個計數(shù)器,當一個內(nèi)存對象建立時計數(shù)器初始化為1(因此此時總是有一個變量引用此對象),往后每有一個新變量引用此內(nèi)存對象,則計數(shù)器加1,而每當減少一個引用此內(nèi)存對象的變量則計數(shù)器減1,當廢物回收機制運作的時分,將全部計數(shù)器為0的內(nèi)存對象銷毀并回收其占用的內(nèi)存。而PHP中內(nèi)存對象就是zval,而計數(shù)器就是refcount__gc。

  例如下面一段PHP代碼演示了PHP5.2計數(shù)器的使命原理(計數(shù)器值始末xdebug得到):

 

  

  $val1 = 100; //zval(val1).refcount_gc = 1;

  $val2 = $val1; //zval(val1).refcount_gc = 2,zval(val2).refcount_gc = 2(由所以Write on copy,其時val2與val1一同引用一個zval)

  $val2 = 200; //zval(val1).refcount_gc = 1,zval(val2).refcount_gc = 1(此處val2新建了一個zval)

  unset($val1); //zval(val1).refcount_gc = 0($val1引用的zval再也不可用,會被GC回收)

  ?>

 

  Reference Counting簡略直觀,完結(jié)便當,但卻存在一個喪身的缺陷,就是簡略構(gòu)成內(nèi)存泄露。許多伴侶可以早年知道到了,假若存在循環(huán)引用,那么Reference Counting就可以引起內(nèi)存泄露。例如下面的代碼:

 

  <?php

發(fā)布:2007-03-31 14:58    編輯:泛普軟件 · xiaona    [打印此頁]    [關(guān)閉]
相關(guān)文章:
鷹潭OA
聯(lián)系方式

成都公司:成都市成華區(qū)建設(shè)南路160號1層9號

重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓

咨詢:400-8352-114

加微信,免費獲取試用系統(tǒng)

QQ在線咨詢

泛普鷹潭網(wǎng)站建設(shè)公司其他應(yīng)用

鷹潭軟件開發(fā)公司 鷹潭門禁系統(tǒng) 鷹潭物業(yè)管理軟件 鷹潭倉庫管理軟件 鷹潭餐飲管理軟件 鷹潭網(wǎng)站建設(shè)公司