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网站优化中友情链接需要注意的问题
- 2引领潮流的全新商业模式,四网合一
- 3网站建设后,如何确定行业切入点进行网络营销
- 4玩具租赁系统功能列表
- 5网站关键字的确定
- 6网站建设之搜索功能强化升级标准
- 7PHP查询字符串技巧
- 8企业站针对用户的优化
- 9JavaScript cookie详解
- 10微信公众平台有什么好处
- 11地方生活优惠电子商务网站需求分析
- 12玩具租赁商城系统需求1
- 13PHP/MYSQL 查询大数据/遍历表
- 14网贷平台主要运营模式主要有两类---传统P2P模式
- 15玩具租赁如何走出困境
- 16企业做网站有没有用?
- 17玩具租赁商城系统需求7
- 18Dreamweaver插件
- 19一篇HTML5分裂成两标准
- 20网站制作绝对不可以犯的编程错误2
- 21考证辅导网站制作解决方案
- 22网站建设何以做到内容丰富
- 23PHPUnit
- 24有关MySQL分页
- 25医疗设备一体化业务管理系统解决方案
- 26租赁网站功能介绍
- 27优质的网站建设方案对网站制作的重要性
- 28 企业四网合一网站升级版2
- 29Android访问php取回json数据
- 30魅妆社区项目开发文档
成都公司:成都市成华区建设南路160号1层9号
重庆公司:重庆市江北区红旗河沟华创商务大厦18楼