一、PHPzavl
zavl包括 变量类型、值、is_ref和refcount字段
is_ref :(bool) 判断变量是否引用。
refcount :计数器。统计指向zavl变量容器的变量个数
is_ref和refcount的关系,当refcount 的值为1 is_ref 为false 。因为refcount为1 时 此变量不可能有多个别名,就不存在利用。
当原变量 = (赋值)给新变量时,原变量的 refcount +1 。
当原变量变化时,给新变量分配内存空间,refcount - 1。
当原变量unset 时 ,新变量直接使用原变量的zavl内容空间。
&引用赋值时,is_ref = 1 ,refcount + 1。给变量&引用赋值,之前赋值过的变量会分配内存空间
二、垃圾回收机制(Garbage Collection)
垃圾回收机制开启可以节省大量内存空间,但是会增加脚本运行时间。
php 5.3中使用专门的算法解决环状引用内存泄露的问题
判断zavl可能为垃圾,将zavl放入内存缓冲区,当缓冲区到达临界默认值(可修改配置),回收算法会遍历所有缓冲区的zavl,判断是否为垃圾,并进行释放处理
php 5.3的gc中实现步骤是:
1、如果一个zavl的refcount 增加,说明zavl正在使用,不是垃圾。不会放到缓冲区。
2、如果zavl的refcount减少到0 ,那么zavl会立即被释放掉。不属于gc要处理的对象,不会放入缓冲区。
3、如果zavl的refcount减少但是大于0,说明zavl还不能被释放,此zavl可能成为垃圾,将其放入缓冲区。
开启/关闭垃圾回收可以通过PHP配置实现,或者在程序中使用
gc_enable() / gs_disable()(开启/关闭)。