成都公司:成都市成華區(qū)建設(shè)南路160號(hào)1層9號(hào)
重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓
當(dāng)前位置:工程項(xiàng)目OA系統(tǒng) > 泛普各地 > 江西OA系統(tǒng) > 鷹潭OA > 鷹潭網(wǎng)站建設(shè)公司
PHP 5中垃圾回收算法的演化
申請(qǐng)免費(fèi)試用、咨詢電話:400-8352-114
鷹潭網(wǎng)站建設(shè)www.diyphp.netPHP是一門保管型言語,在PHP編程中程序員不需求手工處置內(nèi)存資源的分配與開釋(運(yùn)用C編寫PHP或Zend擴(kuò)展在外),這就意味著PHP本身完結(jié)了廢物回收機(jī)制(Garbage Collection)。如今假若去PHP官方網(wǎng)站(php.net)可以看到,其時(shí)PHP5的兩個(gè)分支版別PHP5.2和PHP5.3是分別更新的,這是由于許多項(xiàng)目仍然運(yùn)用5.2版另外PHP,而5.3版別對(duì)5.2并不是完全兼容。PHP5.3在PHP5.2的基礎(chǔ)上做了許多改善,其間廢物回收算法就歸于一個(gè)比較大的改動(dòng)。本文將分別談?wù)揚(yáng)HP5.2和PHP5.3的廢物回收機(jī)制,并談?wù)撨@種演化和改善關(guān)于程序員編寫PHP的影響以及要注重的問題。
PHP變量及關(guān)聯(lián)內(nèi)存對(duì)象的內(nèi)部標(biāo)明
廢物回收說終究是對(duì)變量及其所關(guān)聯(lián)內(nèi)存對(duì)象的操作,所以在談?wù)揚(yáng)HP的廢物回收機(jī)制之前,先簡(jiǎn)明引見PHP中變量及其內(nèi)存對(duì)象的內(nèi)部標(biāo)明(其C源代碼中的標(biāo)明)。

PHP官方文檔中將PHP中的變量劃分為兩類:標(biāo)量類型和凌亂類型。標(biāo)量類型包含布爾型、整型、浮點(diǎn)型和字符串;凌亂類型包含數(shù)組、對(duì)象和資源;還有一個(gè)NULL比較稀奇,它不劃分為任何類型,而是單獨(dú)成為一類。
全部這些類型,在PHP內(nèi)部統(tǒng)一用一個(gè)叫做zval的結(jié)構(gòu)標(biāo)明,在PHP源代碼中這個(gè)結(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”用于標(biāo)明PHP中全部變量的值,這里之所以運(yùn)用union,是由于一個(gè)zval在一個(gè)時(shí)辰只能標(biāo)明一種類型的變量??梢钥吹絖zvalue_value中只需5個(gè)字段,可是PHP中算上NULL有8種數(shù)據(jù)類型,那么PHP內(nèi)部是如何用5個(gè)字段標(biāo)明8種類型呢?這算是PHP描繪比較美妙的一個(gè)當(dāng)?shù)?,它始末?fù)用字段達(dá)到了減少字段的目的。例如,在PHP內(nèi)部布爾型、整型及資源(只需存儲(chǔ)資源的標(biāo)識(shí)符即可)都是始末lval字段存儲(chǔ)的;dval用于存儲(chǔ)浮點(diǎn)型;str存儲(chǔ)字符串;ht存儲(chǔ)數(shù)組(注重PHP中的數(shù)組其實(shí)是哈希表);而obj存儲(chǔ)對(duì)象類型;假若全部字段全部置為0或NULL則標(biāo)明PHP中的NULL,這樣就達(dá)到了用5個(gè)字段存儲(chǔ)8種類型的值。
而其時(shí)zval中的value(value的類型就是_zvalue_value)終究標(biāo)明那種類型,則由“_zval_struct”中的type斷定。_zval_struct就是zval在C言語中的具體完結(jié),每個(gè)zval標(biāo)明一個(gè)變量的內(nèi)存對(duì)象。除了value和type,可以看到_zval_struct中還有兩個(gè)字段refcount__gc和is_ref__gc,從其后綴就可以斷定這兩個(gè)家伙與廢物回收有關(guān)。沒錯(cuò),PHP的廢物回收全賴這倆字段了。其間refcount__gc標(biāo)明其時(shí)有幾個(gè)變量引用此zval,而is_ref__gc標(biāo)明其時(shí)zval能否被按引用引用,這話聽起來很拗口,這和PHP中zval的“Write-On-Copy”機(jī)制有關(guān),由于這個(gè)論題不是本文關(guān)鍵,因此這里不再臚陳,讀者只需記住refcount__gc這個(gè)字段的作用即可。

PHP5.2中的廢物回收算法——Reference Counting
PHP5.2中運(yùn)用的內(nèi)存回收算法是大名鼎鼎的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。
例如下面一段PHP代碼演示了PHP5.2計(jì)數(shù)器的使命原理(計(jì)數(shù)器值始末xdebug得到):
$val1 = 100; //zval(val1).refcount_gc = 1;
$val2 = $val1; //zval(val1).refcount_gc = 2,zval(val2).refcount_gc = 2(由所以Write on copy,其時(shí)val2與val1一同引用一個(gè)zval)
$val2 = 200; //zval(val1).refcount_gc = 1,zval(val2).refcount_gc = 1(此處val2新建了一個(gè)zval)
unset($val1); //zval(val1).refcount_gc = 0($val1引用的zval再也不可用,會(huì)被GC回收)
?>
Reference Counting簡(jiǎn)略直觀,完結(jié)便當(dāng),但卻存在一個(gè)喪身的缺陷,就是簡(jiǎn)略構(gòu)成內(nèi)存泄露。許多伴侶可以早年知道到了,假若存在循環(huán)引用,那么Reference Counting就可以引起內(nèi)存泄露。例如下面的代碼:
<?php
本站推薦
- 1《PHP項(xiàng)目跟蹤管理系統(tǒng)操作流程指南:高效管理項(xiàng)目進(jìn)度與團(tuán)隊(duì)協(xié)作的實(shí)用手冊(cè)》
- 2使用ThinkPHP框架構(gòu)建高效學(xué)生管理系統(tǒng)的獨(dú)特優(yōu)勢(shì)與實(shí)際應(yīng)用價(jià)值
- 3試用PHP軟件項(xiàng)目管理工具:優(yōu)化項(xiàng)目流程,提高團(tuán)隊(duì)協(xié)作效率的絕佳選擇
- 4php生產(chǎn)制造物料管理系統(tǒng)源碼含詳細(xì)注釋與高效功能示例
- 5php采購倉庫管理系統(tǒng)助力企業(yè)高效庫存管控與采購流程優(yōu)化
- 6PHP打造超實(shí)用商品庫存管理系統(tǒng),高效管控庫存不是夢(mèng)!
- 7php庫存管理系統(tǒng)論文:實(shí)現(xiàn)高效庫存管控的技術(shù)方案剖析
- 8php庫存管理系統(tǒng)源碼含詳細(xì)注釋與功能擴(kuò)展教程
- 9php庫存管理系統(tǒng)教程:從搭建到高效應(yīng)用全

