1) PHP的垃圾回收周期是在引用计数减少到非零值时产生的。因此首先需要了解引用计数的知识。
2) 每个php变量存在一个叫"zval"的变量容器中。一个zval变量容器,除了包含变量的类型和值,还包括两个字节的额外信息。第一个是"is_ref",是个bool值,用来标识这个变量是否是属于引用集合(reference set)。
3) 第二个额外字节是"refcount",用以表示指向这个zval变量容器的变量(也称符号即symbol)个数。
5) 把一个变量赋值给另一变量将增加引用次数(refcount)。当任何关联到某个变量容器的变量离开它的作用域(比如:函数执行结束),或者对变量调用了函数 unset()时,”refcount“就会减1。
4) 测试代码示例:
$str = 'Hello World!';xdebug_debug_zval('str');$str1 = $str2 = $str;xdebug_debug_zval('str');unset($str1);xdebug_debug_zval('str');
以上示例输出
str:(refcount=1, is_ref=0),string 'Hello World!' (length=12)str:(refcount=3, is_ref=0),string 'Hello World!' (length=12)str:(refcount=2, is_ref=0),string 'Hello World!' (length=12)
回收周期
1) 在引用计数减少到非零值时,才会产生垃圾周期(garbage cycle)。其次,在一个垃圾周期中,通过检查引用计数是否减1,并且检查哪些变量容器的引用次数是零,来发现哪部分是垃圾。
2) PHP垃圾回收的算法是模拟删除、模拟恢复、真的删除,每个动作都使用深搜遍历。
3) PHP回收机制的配置:zend.enable_gc。也能通过分别调用gc_enable() 和 gc_disable()函数来打开和关闭垃圾回收机制,调用gc_disable()函数释放内存之前,先调用gc_collect_cycles()函数可能比较明智。
4) 对性能影响的领域:第一个是内存占用空间的节省,另一个是垃圾回收机制执行内存清理时的执行时间增加
5) 在PHP执行中,一旦根缓冲区满了或者调用gc_collect_cycles() 函数时,就会执行垃圾回收。
相关推荐:
以上就是PHP之垃圾回收机制详解的详细内容,更多请关注Work网其它相关文章!