background image

浅谈

PHP5 中垃圾回收算法(Garbage 

Collection)的演化

核心提示:

PHP 是一门托管型语言,在 PHP 编程中程序员不需要手工处理内存资源的

分配与释放(使用

C 编写 PHP 或 Zend 扩展除外),这就意味着 PHP 本身实现了垃圾

回收机制(

Garbage Collection)。

前言:

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;