浅谈
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;