zoukankan      html  css  js  c++  java
  • PHP垃圾回收机制

    1.PHP垃圾回收机制主要用到了引用计数概念。
    在每个变量生成的时候后存在于一个叫做“ZAVAL”的变量容器里面。一个zval变量容器,除了包含变量的类型和值,还包括两个字节的额外信息。第一个是"is_ref",是个bool值,用来标识这个变量是否是属于引用集合(reference set)。通过这个字节,php引擎才能把普通变量和引用变量区分开来,由于php允许用户通过使用&来使用自定义引用,zval变量容器中还有一个内部引用计数机制,来优化内存使用。第二个额外字节是"refcount",用以表示指向这个zval变量容器的变量(也称符号即symbol)个数。当refcount=0时,则出发垃圾回收,将这个变量销毁。
    例如:

    如果开启了Xdebug,则可以使用xdebug_debug_zval()函数显示is_ref和refcount的值。

    输出:a: (refcount=1, is_ref=0)='new string'
    把一个变量赋值给另一变量将增加引用次数(refcount).
    当没必要时,php不会去复制已生成的变量容器。变量容器在”refcount“变成0时就被销毁. 当任何关联到某个变量容器的变量离开它的作用域(比如:函数执行结束),或者对变量调用了函数 unset()时,”refcount“就会减1。
    当考虑像 array和object这样的复合类型时,事情就稍微有点复杂. 与 标量(scalar)类型的值不同,array和 object类型的变量把它们的成员或属性存在自己的符号表中。这意味着下面的例子将生成三个zval变量容器。

    'life', 'number' => 42 ); xdebug_debug_zval( 'a' ); ?>

    输出:
    a: (refcount=1, is_ref=0)=array (
    'meaning' => (refcount=1, is_ref=0)='life',
    'number' => (refcount=1, is_ref=0)=42
    )
    删除数组中的一个元素,就是类似于从作用域中删除一个变量. 删除后,数组中的这个元素所在的容器的“refcount”值减少,同样,当“refcount”为0时,这个变量容器就从内存中被删除。

  • 相关阅读:
    Git学习手记(一)
    微信开发手记(二)
    mysql命令行打开中文乱码
    在linux上centos6安装pdo_mysql扩展
    在linux上安装php5.6版本提示GD2版本要高于2.1.0解决
    在linux上安装apache是出现error1错误
    在linux上搭建amp环境安装jpeg时出现libtool command not found,error127解决
    在linux中搭建amp环境(apache2.4.7+mysql5.5.23+php5.6.19)
    mysql忘记root密码解决办法
    移动端网页设计经验与心得
  • 原文地址:https://www.cnblogs.com/ontheway1024/p/8848902.html
Copyright © 2011-2022 走看看