當前位置:工程項目OA系統(tǒng) > 泛普各地 > 江西OA系統(tǒng) > 鷹潭OA > 鷹潭網站建設公司
PHP 5中垃圾回收算法的演化
PHP是一門保管型言語,在PHP編程中程序員不需求手工處置內存資源的分配與開釋(運用C編寫PHP或Zend擴展在外),這就意味著PHP本身完結了廢物回收機制(Garbage Collection)。如今假若去PHP官方網站(php.net)可以看到,其時PHP5的兩個分支版別PHP5.2和PHP5.3是分別更新的,這是由于許多項目仍然運用5.2版另外PHP,而5.3版別對5.2并不是完全兼容。PHP5.3在PHP5.2的基礎上做了許多改善,其間廢物回收算法就歸于一個比較大的改動。本文將分別談論PHP5.2和PHP5.3的廢物回收機制,并談論這種演化和改善關于程序員編寫PHP的影響以及要注重的問題。
PHP變量及關聯(lián)內存對象的內部標明
廢物回收說終究是對變量及其所關聯(lián)內存對象的操作,所以在談論PHP的廢物回收機制之前,先簡明引見PHP中變量及其內存對象的內部標明(其C源代碼中的標明)。
PHP官方文檔中將PHP中的變量劃分為兩類:標量類型和凌亂類型。標量類型包含布爾型、整型、浮點型和字符串;凌亂類型包含數組、對象和資源;還有一個NULL比較稀奇,它不劃分為任何類型,而是單獨成為一類。
全部這些類型,在PHP內部統(tǒng)一用一個叫做zval的結構標明,在PHP源代碼中這個結構名稱為“_zval_struct”。zval的具體定義在PHP源代碼的“Zend/zend.h”文件中,下面是關聯(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種數據類型,那么PHP內部是如何用5個字段標明8種類型呢?這算是PHP描繪比較美妙的一個當地,它始末復用字段達到了減少字段的目的。例如,在PHP內部布爾型、整型及資源(只需存儲資源的標識符即可)都是始末lval字段存儲的;dval用于存儲浮點型;str存儲字符串;ht存儲數組(注重PHP中的數組其實是哈希表);而obj存儲對象類型;假若全部字段全部置為0或NULL則標明PHP中的NULL,這樣就達到了用5個字段存儲8種類型的值。
而其時zval中的value(value的類型就是_zvalue_value)終究標明那種類型,則由“_zval_struct”中的type斷定。_zval_struct就是zval在C言語中的具體完結,每個zval標明一個變量的內存對象。除了value和type,可以看到_zval_struct中還有兩個字段refcount__gc和is_ref__gc,從其后綴就可以斷定這兩個家伙與廢物回收有關。沒錯,PHP的廢物回收全賴這倆字段了。其間refcount__gc標明其時有幾個變量引用此zval,而is_ref__gc標明其時zval能否被按引用引用,這話聽起來很拗口,這和PHP中zval的“Write-On-Copy”機制有關,由于這個論題不是本文關鍵,因此這里不再臚陳,讀者只需記住refcount__gc這個字段的作用即可。
PHP5.2中的廢物回收算法——Reference Counting
PHP5.2中運用的內存回收算法是大名鼎鼎的Reference Counting,這個算法中文翻譯叫做“引用計數”,其思想非常直觀和簡練:為每個內存對象分配一個計數器,當一個內存對象建立時計數器初始化為1(因此此時總是有一個變量引用此對象),往后每有一個新變量引用此內存對象,則計數器加1,而每當減少一個引用此內存對象的變量則計數器減1,當廢物回收機制運作的時分,將全部計數器為0的內存對象銷毀并回收其占用的內存。而PHP中內存對象就是zval,而計數器就是refcount__gc。
例如下面一段PHP代碼演示了PHP5.2計數器的使命原理(計數器值始末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簡略直觀,完結便當,但卻存在一個喪身的缺陷,就是簡略構成內存泄露。許多伴侶可以早年知道到了,假若存在循環(huán)引用,那么Reference Counting就可以引起內存泄露。例如下面的代碼:
<?php
- 1魅妝社區(qū)項目開發(fā)文檔
- 2Linux操作系統(tǒng)中用PHP構建網站詳解
- 3網站策劃的重要討論
- 4玩具租賃如何走出困境
- 5最新動態(tài)-久途遷新址
- 6引領潮流的全新商業(yè)模式,四網合一
- 7網站建設的效果圖設計不好導致的一些后果
- 8如何使自己的企業(yè)網站和同行業(yè)的網站不類似沖突
- 9最全Facebook圖片存儲架構技術
- 10代碼審查可以幫助提高代碼質量
- 11全站內置SEO優(yōu)化機制
- 12有關MySQL分頁
- 13上海天煜商業(yè)聯(lián)盟成功上線
- 14網站優(yōu)化企業(yè)的方法
- 15利用構造方法實現(xiàn)模塊的解耦
- 16構造開發(fā)模板 五種PHP設計模式
- 17MySql常用命令總結
- 18網貸平臺主要運營模式主要有兩類---傳統(tǒng)P2P模式
- 19IEG電子學習系統(tǒng)需求說明書
- 20O2O已經成為電子商務網站的下一個掘金點
- 21關于編碼最佳應用實踐
- 22Dreamweaver插件
- 23企業(yè)四網合一網站升級版1
- 24瀏覽器開發(fā)工具的秘密
- 252014年玩具租賃市場達8億,如何抓住這市場良機?
- 26玩具租賃系統(tǒng)功能列表
- 27企業(yè)為什么偏愛需要資深的網站設計企業(yè)做官方網站呢?
- 28網站備案所需材料
- 29Asia-Pacific Economic Cooperation 工商咨詢理事會亞太中小企業(yè)峰會
- 30企業(yè)為什么偏愛須要專業(yè)的網站構造單位做官方網站呢?
成都公司:成都市成華區(qū)建設南路160號1層9號
重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務大廈18樓