PHP 的垃圾回收机制
软件开发中的垃圾回收机制是一种自动打扫和清除内存垃圾技术,它可以有效防范动态内存分配中可能发生的危险:
1.因内容垃圾过多而引发的内存耗尽。
2.不恰当的内存释放所造成的内存非法引用。
在PHP5.2及更早版本的PHP中,没有专门的垃圾回收器GC(Garbage Collection) ,引擎在判断一个变量空间是否能够被释放的时候是依据这个变量的zval的refcount的值,如果refcount为0,那么变量的空间可以被释放,否则就不是放,这是一种非常简单的GC实现。然而在这种简单的GC实现方案中,出现了意想不到的变量内存泄漏情况,引擎将无法回收这些内存,于是在php5.3 中出现了新的GC,新的GC有专门的机制负责清理垃圾数据,防止内存泄漏。
1.引用计数基本知识
每个php变量存在一个叫"zval"的变量容器中。
一个zval变量容器,除了包含变量的类型和值,还包括两个字节的额外信息。第一个是"is_ref",是个bool值,用来标识这个变量是否是属于引用集合(reference set)。
通过这个字节,php引擎才能把普通变量和引用变量区分开来,由于php允许用户通过使用&来使用自定义引用,zval变量容器中还有一个内部引用计数机制,来优化内存使用。第二个额外字节是"refcount",用以表示指向这个zval变量容器的变量(也称符号即symbol)个数。
所有的符号存在一个符号表中,其中每个符号都有作用域(scope),那些主脚本(比如:通过浏览器请求的的脚本)和每个函数或者方法也都有作用域。
删除数组中的一个元素,就是类似于从作用域中删除一个变量. 删除后,数组中的这个元素所在的容器的“refcount”值减少,同样,当“refcount”为0时,这个变量容器就从内存中被删除