PHP语言中的垃圾回收机制-阿里云开发者社区

开发者社区> 开发与运维> 正文

PHP语言中的垃圾回收机制

简介:

PHP使用Copy-on write和引用计数来管理内存。

Copy-on-write又是简写为COW(写入时复制),是计算机编程中的一种优化策略。Copy-on-write在PHP中,可以认为多个变量都使用信息的同一份拷贝,也就是说这些变量都指向同一个内存地址。由于只是读取这些变量。没有必要为每个变量在内存中拷贝一份相同的值,这就节省了很多内存资源。但是当一个变量需要修改值的时候,将真正的对象复制到新的内存地址中,并修改新对象的内存映射表指向这个新的位置,并在新的内存位置上执行写操作。

如下面的代码:

1
2
3
4
5
6
7
<?php
$a=array(1,4,5);
$b=$a;//数组并未被复制
$a[1]=10;//数组复制了,并且修改了值
print_r($a);
print_r($b);
?>

运行完毕后$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释放掉。

















本文转自cnn23711151CTO博客,原文链接: http://blog.51cto.com/cnn237111/1281534,如需转载请自行联系原作者



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章