當前位置:工程項目OA系統(tǒng) > 泛普各地 > 江西OA系統(tǒng) > 鷹潭OA > 鷹潭網(wǎng)站建設(shè)公司
PHP 5中垃圾回收算法的演化
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
- 1魅妝社區(qū)項目開發(fā)文檔
- 2Linux操作系統(tǒng)中用PHP構(gòu)建網(wǎng)站詳解
- 3網(wǎng)站策劃的重要討論
- 4玩具租賃如何走出困境
- 5最新動態(tài)-久途遷新址
- 6引領(lǐng)潮流的全新商業(yè)模式,四網(wǎng)合一
- 7網(wǎng)站建設(shè)的效果圖設(shè)計不好導致的一些后果
- 8如何使自己的企業(yè)網(wǎng)站和同行業(yè)的網(wǎng)站不類似沖突
- 9最全Facebook圖片存儲架構(gòu)技術(shù)
- 10代碼審查可以幫助提高代碼質(zhì)量
- 11全站內(nèi)置SEO優(yōu)化機制
- 12有關(guān)MySQL分頁
- 13上海天煜商業(yè)聯(lián)盟成功上線
- 14網(wǎng)站優(yōu)化企業(yè)的方法
- 15利用構(gòu)造方法實現(xiàn)模塊的解耦
- 16構(gòu)造開發(fā)模板 五種PHP設(shè)計模式
- 17MySql常用命令總結(jié)
- 18網(wǎng)貸平臺主要運營模式主要有兩類---傳統(tǒng)P2P模式
- 19IEG電子學習系統(tǒng)需求說明書
- 20O2O已經(jīng)成為電子商務(wù)網(wǎng)站的下一個掘金點
- 21關(guān)于編碼最佳應(yīng)用實踐
- 22Dreamweaver插件
- 23企業(yè)四網(wǎng)合一網(wǎng)站升級版1
- 24瀏覽器開發(fā)工具的秘密
- 252014年玩具租賃市場達8億,如何抓住這市場良機?
- 26玩具租賃系統(tǒng)功能列表
- 27企業(yè)為什么偏愛需要資深的網(wǎng)站設(shè)計企業(yè)做官方網(wǎng)站呢?
- 28網(wǎng)站備案所需材料
- 29Asia-Pacific Economic Cooperation 工商咨詢理事會亞太中小企業(yè)峰會
- 30企業(yè)為什么偏愛須要專業(yè)的網(wǎng)站構(gòu)造單位做官方網(wǎng)站呢?
成都公司:成都市成華區(qū)建設(shè)南路160號1層9號
重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓