普通的引用变量的销毁大家都知道, 当unset的时候如果refcount = 0 则认为无用, 销毁。

但是手册中提到一点会有递归引用的问题,很是奇葩

代码如下

<?php

$a = 1;
$arr[0] = &$a;
$arr[1] = &$arr;
/*
用print_r打印出现
Array
(
[0] => 1
[1] => Array
(
[0] => 1
[1] => Array
*RECURSION*
) )
*/

这个时候 $arr[1] 递归的引用了$arr , 虽然没有意义,但是按照原来的判断refcount为0的方式会出现问题,因为当unset($arr)时, refcount=1  ,此时$arr成为一个没有任何变量指向的垃圾数据。

手册中提到的方法是

当一个变量出现refcount引用计数减少到非零值时, 这个变量就进去了垃圾回收缓冲区

缓冲区定时进行数据清理

步骤如下

深度优先遍历每个结点,被遍历的结点被标记为已经遍历,第二次遍历到将不会再进行操作,  遍历处理操作是将refcount--  , 如果遍历结束时 refcount=0 则认为是垃圾数据,则回收, 如果refcount>0 则 refcount+=1

此处疑问出来了,这种方式明显有缺陷

比如

1.   对于 $a = 1; $b =&$a;   然后unset($b);  此时$a进入垃圾回收周期, 被遍历,并且refcount--后refcount=0  被回收, 但是$a此时还有用啊。这种情况属于有用的资源被误回收

2.   $a = 1; $arr = arrary(); $arr[0] = &$a;  $arr[1] = &$arr; $arr[2] = &$arr; unset($arr);   此处有两处引用 , 但是处理的时候如果遍历并且refcount--之后再次遍历不再进行refcount--操作,所以 $arr这种垃圾是没法回收的

官方手册的地址如下, 不知道是不是被我曲解了, http://www.php.net/manual/zh/features.gc.collecting-cycles.php

PHP GC垃圾回收机制之引用变量回收周期疑问的更多相关文章

  1. Python的垃圾回收机制(引用计数+标记清除+分代回收)

    一.写在前面: 我们都知道Python一种面向对象的脚本语言,对象是Python中非常重要的一个概念.在Python中数字是对象,字符串是对象,任何事物都是对象,而它们的核心就是一个结构体--PyOb ...

  2. PHP的垃圾回收机制之引用计数

    1,介绍 php的垃圾回收机制(GC)是在PHP5之后出现的,而在PHP5.3版本之前使用的都是“引用计数”的方式.实现引用计数的实质就是在每个内存对象中都有一个计数器,当内存对象被变量引用时,计数器 ...

  3. Python的垃圾回收机制以及引用计数

    Python中的计数引用 在Python中,由于Python一门动态的语言,内部采用的指针形式对数据进行标记的,并不像c/c++那样,通过指定的数据类型并分配相应的数据空间,Python中定义的变量名 ...

  4. JVM的垃圾回收机制 总结(垃圾收集、回收算法、垃圾回收器)

     相信和小编一样的程序猿们在日常工作或面试当中经常会遇到JVM的垃圾回收问题,有没有在夜深人静的时候详细捋一捋JVM垃圾回收机制中的知识点呢?没时间捋也没关系,因为小编接下来会给你捋一捋. 一. 技术 ...

  5. 学习PHP垃圾回收机制了解引用计数器的概念

    php变量存在一个叫"zval"的变量容器中,"zval"变量容器包括含变量的类型和值,还包括额外的两个字节信息,分别是“is_ref”表示变量是否属于引用,“ ...

  6. php 调试工具及学习PHP垃圾回收机制了解引用计数器的概念

    php代码工具:Xdebug  与分析工具 WinCacheGrind Xdebug之函数大全: string xdebug_call_class()返回当前被调用的函数或方法所属的类的类名 stri ...

  7. JVM内存管理 + GC垃圾回收机制

    2.JVM内存管理 JVM将内存划分为6个部分:PC寄存器(也叫程序计数器).虚拟机栈.堆.方法区.运行时常量池.本地方法栈 PC寄存器(程序计数器):用于记录当前线程运行时的位置,每一个线程都有一个 ...

  8. 编程语言类别;运行Python程序的方式;变量和常量;Python程序的垃圾回收机制;

    目录 编程语言分类 运行Python程序的两种方式 1.交互式 变量与常量 1.变量 2.常量 3.小整数池 垃圾回收机制 编程语言分类 编程语言分为: 1.机器语言:直接用二进制的0和1和计算机(C ...

  9. 编程语言分类,Python代码执行,应用程序使用文件的三步骤,变量,常量,垃圾回收机制

    编程语言分为 机器语言(直接用二进制01跟计算机直接沟通交流,直接操作硬件) 优点:计算机能够直接读懂,速度快 缺点:开发效率极低 汇编语言(用简单的英文标签来表示二进制数,直接操作硬件) 优点:开发 ...

随机推荐

  1. copy和assign的使用和区别

    1.使用copy和assign都可以进行修饰属性或者变量. 2.区别: (1)copy的使用:使用这个进行修饰的属性,当已经进行初始化之后,就无法再改变属性的数据. 如: @property (cop ...

  2. Emacs和Ultra Edit列编辑模式

    在emacs中可以使用C-r系列组合键进行区域选择编辑,或者使用emacs自带的cua-mode,然后键入C-ret进行可视化列编辑. 使用Ultra Edit同样可以方便的进入列编辑模式,只需要按下 ...

  3. 黑马程序员——【Java基础】——多线程

    ---------- android培训.java培训.期待与您交流! ---------- 一.概述 (一)进程 正在执行中的程序,每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控 ...

  4. PHP中常用正则表达式大全

    常用正则表达式大全!(例如:匹配中文.匹配html) 匹配中文字符的正则表达式: [u4e00-u9fa5]    评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内 ...

  5. context理解

    官方文档的解释是:Context提供了关于应用环境全局信息的接口.它是一个抽象类,它的执行被Android系统所提供.它允许获取以应用为特征的资源和类型.同时启动应用级的操作,如启动Activity, ...

  6. Codeforces Round #365 (Div. 2)-D Mishka and Interesting sum(树状数组)

    题目链接:http://codeforces.com/contest/703/problem/D 思路:看了神犇的代码写的... 偶数个相同的数异或结果为0,所以区间ans[l , r]=区间[l , ...

  7. Bxm做的第一个CrackMe(已补上注册机)

    系统 : Windows xp 程序 : Bxm_CrackMe1 程序下载地址 :http://pan.baidu.com/s/1pK0a0xt 要求 : 分析算法 使用工具 :OD 可在看雪论坛中 ...

  8. Codeforces 699

    Problem A Launch of Collider 题目大意 在x轴上有n个点,坐标均为偶数.每个点或向左移动或向右移动,每秒移动距离为1. 使所有点同时开始移动,求最早有点相遇的时间或无解. ...

  9. Jquery autocomplete插件的使用

    简单用法: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEnc ...

  10. mysql [ERROR] Can't create IP socket: Permission denied

    /*************************************************************************** * mysql [ERROR] Can't c ...