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,如需转载请自行联系原作者



相关文章
|
2天前
|
程序员 Go PHP
为什么大部分的 PHP 程序员转不了 Go 语言?
【9月更文挑战第8天】大部分 PHP 程序员难以转向 Go 语言,主要因为:一、编程习惯与思维方式差异,如语法风格和编程范式;二、学习成本高,需掌握新知识体系且面临项目压力;三、职业发展考量,现有技能价值及市场需求不确定性。学习新语言虽有挑战,但对拓宽职业道路至关重要。
24 10
|
2天前
|
算法 程序员 Go
PHP 程序员学会了 Go 语言就能唬住面试官吗?
【9月更文挑战第8天】学会Go语言可提升PHP程序员的面试印象,但不足以 solely “唬住” 面试官。学习新语言能展现学习能力、拓宽技术视野,并增加就业机会。然而,实际项目经验、深入理解语言特性和综合能力更为关键。全面展示这些方面才能真正提升面试成功率。
21 10
|
11天前
|
IDE 关系型数据库 PHP
php语言学习
【9月更文挑战第1天】php语言学习
22 3
|
11天前
|
SQL 关系型数据库 MySQL
PHP语言
【9月更文挑战第1天】PHP语言
18 2
|
1月前
|
安全 JavaScript 前端开发
PHP与现代Web开发:探索语言的演变和挑战
【8月更文挑战第9天】本文深入探讨了PHP作为一门历史悠久的编程语言在现代Web开发中的地位,分析了它如何适应不断变化的技术环境。文章首先回顾了PHP的起源及其在Web开发中的早期应用,随后讨论了PHP 7及更高版本带来的性能提升和新特性,以及这些变化对开发者的意义。最后,文章探讨了PHP面临的挑战,包括与其他现代编程语言的竞争,安全性问题,以及社区和生态系统的支持。通过这篇文章,读者将获得对PHP在现代Web开发中角色的全面理解,以及它如何继续发展以适应新的技术要求。
24 3
|
1月前
|
算法 安全 Java
|
1月前
|
存储 监控 Java
深入理解PHP中的垃圾回收机制
在动态语言的世界中,内存管理是一个不可忽视的话题。PHP作为一门广泛使用的服务器端脚本语言,其内部如何自动管理内存资源,对开发者而言是既神秘又重要的。本文将揭开PHP垃圾回收机制的面纱,探索它如何在幕后默默维护着我们的应用程序,确保资源的合理利用与释放。从引用计数到周期收集,我们将一探究竟。
29 2
|
1月前
|
SQL 安全 PHP
探寻PHP的现代演进之路:从Web开发到框架创新——揭秘PHP语言如何引领技术潮流
【8月更文挑战第2天】探索PHP的现代演进:从Web开发到框架创新
31 1
|
1月前
|
运维 Java 应用服务中间件
自动化运维:使用Ansible进行服务器配置管理深入理解PHP的垃圾回收机制
【7月更文挑战第31天】在现代IT环境中,自动化运维是提高效率、降低错误率的关键。本文将介绍如何使用Ansible——一种流行的开源自动化工具,来简化和自动化服务器的配置管理。我们将通过一个实际的代码示例,展示如何利用Ansible进行自动化部署和配置更新,确保你的服务器始终运行最新、最安全的软件版本。
13 1
|
2月前
|
Oracle 关系型数据库 数据库连接
PHP 语言的特性主
【7月更文挑战第15天】PHP的特性
45 14