PHP官方手册研读--php的垃圾回收机制

简介: 在PHP中,没有任何变量指向这个对象时,这个对象就成为垃圾;

概述

php中何为垃圾

在PHP中,没有任何变量指向这个对象时,这个对象就成为垃圾;

垃圾的产生过程

<?php
$a = array('one');
$a[] = &$a;
xdebug_debug_zval('a');
<?php


注意,xdebug_debug_zval函数是xdebug扩展的,使用前必须安装xdebug扩展,输出如下

output:
a:(refcount=2, is_ref=1)
array (size=2)
  0 => (refcount=1, is_ref=0)string 'one' (length=3)
  1 => (refcount=2, is_ref=1)  &array<


这样$a数组就有两个元素,一个索引为0,值为字符one,另外一个索引为1,为$a自身的引用,内部存储如下:

那么问题就产生了,$a已经不在符号表中,用户无法再访问此变量,但是$a之前指向的zval的refcount_gc变为1而不是0,因此不能被回收,从而产生内存泄露,GC要做的工作就是清理此类垃圾。

算法(内存泄露)

PHP手册中有简单的介绍GC使用的垃圾清理算法,这个算法名为 Concurrent Cycle Collection in Reference Counted Systems(引用计数系统中的同步周期回收)。

  • 如果一个zval的refcount_gc增加,那么此zval还在使用,不属于垃圾
  • 如果一个zval的refcount减少到0, 那么zval可以被释放掉,不属于垃圾
  • 如果一个zval的refcount减少之后大于0,那么此zval还不能被释放,此zval可能成为一个垃圾

算法介绍:

A:为避免不得不检查所有引用计数可能减少的垃圾周期,这个算法把所有可能根(possible roots 都是zval变量容器),放在根缓冲区(root buffer)中(用紫色来标记,称为疑似垃圾),这样可以同时确保每个可能的垃圾根(possible garbage root)在缓冲区中只出现一次。仅仅在根缓冲区满了时,才对缓冲区内部所有不同的变量容器执行垃圾回收操作。
B:模拟删除每个紫色变量。模拟删除时可能将不是紫色的普通变量引用数减”1”,如果某个普通变量引用计数变成0了,就对这个普通变量再做一次模拟删除。每个变量只能被模拟删除一次,模拟删除后标记为灰。
C:模拟恢复每个紫色变量。恢复是有条件的,当变量的引用计数大于0时才对其做模拟恢复。同样每个变量只能恢复一次,恢复后标记为黑,基本就是步骤 B 的逆运算。这样剩下的一堆没能恢复的就是该删除的蓝色节点了,在步骤 D 中遍历出来真的删除掉。

算法中都是模拟删除、模拟恢复、真的删除,都使用简单的遍历即可(最典型的深搜遍历)。复杂度为执行模拟操作的节点数正相关,不只是紫色的那些疑似垃圾变量。


目录
相关文章
|
2月前
|
Java PHP
深入理解PHP中的垃圾回收机制
深入理解PHP中的垃圾回收机制
48 3
|
7月前
|
算法 Java PHP
深入理解PHP的垃圾回收机制
在动态语言中,内存管理是至关重要的一部分,而PHP作为一门流行的动态脚本语言,其垃圾回收(GC)机制对于维持性能和稳定性起着关键作用。本文将深入探讨PHP的垃圾回收机制,从它的工作原理、实现方式到对开发者的影响,以及如何优化内存使用等方面进行详细阐述,帮助开发者更好地理解和掌握这一核心特性。
|
3月前
|
监控 Java PHP
深入理解 PHP 中的垃圾回收机制
PHP,作为一门广泛使用的服务器端脚本语言,其性能和资源管理一直是开发者关注的焦点。本文将深入探讨PHP中的垃圾回收机制,包括垃圾回收的工作原理、影响垃圾回收的因素,以及开发者如何通过代码优化来改善垃圾回收效率。通过本文,你将了解到PHP垃圾回收的内部细节,并掌握一些实用的技巧来提升你的应用性能。
|
3月前
|
Java PHP
PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。理解其垃圾回收机制有助于开发高效稳定的PHP应用。
【10月更文挑战第1天】PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。其垃圾回收机制包括引用计数与循环垃圾回收,对提升应用性能和稳定性至关重要。本文通过具体案例分析,详细探讨PHP垃圾回收机制的工作原理,特别是如何解决循环引用问题。在PHP 8中,垃圾回收机制得到进一步优化,提高了效率和准确性。理解这些机制有助于开发高效稳定的PHP应用。
56 3
|
5月前
|
存储 监控 Java
深入理解PHP中的垃圾回收机制
在动态语言的世界中,内存管理是一个不可忽视的话题。PHP作为一门广泛使用的服务器端脚本语言,其内部如何自动管理内存资源,对开发者而言是既神秘又重要的。本文将揭开PHP垃圾回收机制的面纱,探索它如何在幕后默默维护着我们的应用程序,确保资源的合理利用与释放。从引用计数到周期收集,我们将一探究竟。
48 2
|
5月前
|
运维 Java 应用服务中间件
自动化运维:使用Ansible进行服务器配置管理深入理解PHP的垃圾回收机制
【7月更文挑战第31天】在现代IT环境中,自动化运维是提高效率、降低错误率的关键。本文将介绍如何使用Ansible——一种流行的开源自动化工具,来简化和自动化服务器的配置管理。我们将通过一个实际的代码示例,展示如何利用Ansible进行自动化部署和配置更新,确保你的服务器始终运行最新、最安全的软件版本。
30 1
|
5月前
|
Java PHP 开发者
深入理解PHP的垃圾回收机制
【8月更文挑战第15天】在PHP编程中,内存管理是一个至关重要的话题。不同于其他编程语言,如C++和Java,PHP提供了自动的垃圾回收机制来帮助开发者管理内存。本文将深入探讨PHP的垃圾回收机制,包括它的工作原理、如何影响性能以及开发者如何利用这一机制来优化应用程序的性能。文章不包含代码示例,旨在通过文字阐述让读者对PHP的垃圾回收有一个清晰的认识。
55 0
|
5月前
|
算法 Java PHP
深入理解PHP的垃圾回收机制
在动态语言的世界中,内存管理是一项至关重要的任务。对于PHP开发者来说,了解其内部的垃圾回收机制不仅可以帮助我们写出更加高效的代码,还能避免一些难以察觉的内存泄漏问题。本文将深入浅出地探讨PHP的垃圾回收机制,从原理到实践,带领读者一探究竟。
|
6月前
|
Java API PHP
【亲测有效,官方提供】php版本企查查api接口请求示例代码,php请求企查查api接口,thinkphp请求企查查api接口
【亲测有效,官方提供】php版本企查查api接口请求示例代码,php请求企查查api接口,thinkphp请求企查查api接口
183 1
|
7月前
|
Java PHP 开发者
深入理解PHP的垃圾回收机制
【6月更文挑战第22天】在动态语言如PHP中,内存管理是一个核心话题。本文将探讨PHP的垃圾回收机制,揭示其背后的原理与实践。不同于常规的技术文章,我们将通过一个实际的Web应用案例来分析垃圾回收的影响,并讨论开发者如何有效利用这一机制优化性能。