>  기사  >  백엔드 개발  >  분석: PHP 가비지 수집 메커니즘

분석: PHP 가비지 수집 메커니즘

WBOY
WBOY원래의
2016-07-25 08:56:351021검색
  1. $a=array(1,4,5);
  2. $b=$a;//数组并未被复制
  3. $a[1]=10;//数组复制了,并且修改了值
  4. print_r($a);
  5. print_r($b);
  6. ?>
复制代码

运行完毕后$a和$b的值是不相同的。 $a是1,10,5 $b是1,4,5 这有点类似C#中值类型的赋值。要使得$a和$b始终是同一份引用,则代码写为:

  1. $b=&$a;
复制代码

PHP中和Copy-on-write技术搭配的一个术语叫引用计数(reference count)。 在PHP中每一个变量都有2部分组成,一个是变量名,还有就是变量的值,他们存放在一个称为符号表的结构中,这个符号表是一个数组,它映射了变量名和值在内存中的位置。符号表中每一个值都有一个所谓的引用计数,记录了有多少种方法能够获得这个值,即有多少个变量名指向这个值。

在以上的代码中,当$a初始化后,$b=$a后,这个数组就有一个引用计数2(如果你通过C的API方法去查看引用计数,这个值实际上是3,但从用户角度来看,解释成2更好理解)。 这个内存中的值可以有2种方法获得,通过$a和$b.然后当$a[1]的值改变之后,则php为$a创建了一个新的内存空间,也就是出现2个数组了。 这两个数组的引用计数都为1。

当一个变量走出了作用域范围,比如函数中的本地变量,这个变量在函数运行完后就失效了,那么之前这个变量指向的值的引用计数就会减1。同样的,如果一个变量指向一个新的内存地址,那么这个老的地址的值上的引用计数也会减1。

当一个内存空间的引用计数为0的时候,就会被PHP释放掉。



성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.