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变量及关联内存对象的内部标明
废物回收说终究是对变量及其所关联内存对象的操作,所以在谈论PHP的废物回收机制之前,先简明引见PHP中变量及其内存对象的内部标明(其C源代码中的标明)。
PHP官方文档中将PHP中的变量划分为两类:标量类型和凌乱类型。标量类型包含布尔型、整型、浮点型和字符串;凌乱类型包含数组、对象和资源;还有一个NULL比较稀奇,它不划分为任何类型,而是单独成为一类。
全部这些类型,在PHP内部统一用一个叫做zval的结构标明,在PHP源代码中这个结构名称为“_zval_struct”。zval的具体定义在PHP源代码的“Zend/zend.h”文件中,下面是关联代码的摘录。
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;
};
其间联合体“_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简略直观,完结便当,但却存在一个丧身的缺陷,就是简略构成内存泄露。许多伴侣可以早年知道到了,假若存在循环引用,那么Reference Counting就可以引起内存泄露。例如下面的代码:
<?php
- 1魅妆社区项目开发文档
- 2Linux操作系统中用PHP构建网站详解
- 3网站策划的重要讨论
- 4玩具租赁如何走出困境
- 5最新动态-久途迁新址
- 6引领潮流的全新商业模式,四网合一
- 7网站建设的效果图设计不好导致的一些后果
- 8如何使自己的企业网站和同行业的网站不类似冲突
- 9最全Facebook图片存储架构技术
- 10代码审查可以帮助提高代码质量
- 11全站内置SEO优化机制
- 12有关MySQL分页
- 13上海天煜商业联盟成功上线
- 14网站优化企业的方法
- 15利用构造方法实现模块的解耦
- 16构造开发模板 五种PHP设计模式
- 17MySql常用命令总结
- 18网贷平台主要运营模式主要有两类---传统P2P模式
- 19IEG电子学习系统需求说明书
- 20O2O已经成为电子商务网站的下一个掘金点
- 21关于编码最佳应用实践
- 22Dreamweaver插件
- 23企业四网合一网站升级版1
- 24浏览器开发工具的秘密
- 252014年玩具租赁市场达8亿,如何抓住这市场良机?
- 26玩具租赁系统功能列表
- 27企业为什么偏爱需要资深的网站设计企业做官方网站呢?
- 28网站备案所需材料
- 29Asia-Pacific Economic Cooperation 工商咨询理事会亚太中小企业峰会
- 30企业为什么偏爱须要专业的网站构造单位做官方网站呢?
成都公司:成都市成华区建设南路160号1层9号
重庆公司:重庆市江北区红旗河沟华创商务大厦18楼