千家信息网

PHP垃圾回收机制的简单讲解

发表于:2024-11-29 作者:千家信息网编辑
千家信息网最后更新 2024年11月29日,本篇内容主要讲解"PHP垃圾回收机制的简单讲解",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"PHP垃圾回收机制的简单讲解"吧!垃圾回收是什么东西?在使用
千家信息网最后更新 2024年11月29日PHP垃圾回收机制的简单讲解

本篇内容主要讲解"PHP垃圾回收机制的简单讲解",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"PHP垃圾回收机制的简单讲解"吧!

垃圾回收是什么东西?

在使用 C 语言的时候,我们都要手动使用 free 来释放内存,在 C 之后的大部分编程语言都会自带一个垃圾回收之类的处理能力,也就是我们今天要说的垃圾回收机制,也称为 GC 。在有 GC 能力的开发语言中,我们不需要去关心什么时候释放内存,甚至我们完全不需要去了解这一块的内容,因为这些语言在底层已经帮我们处理好了关于内存释放的问题。

当然这方面的内容最出名的就是 Java 中的垃圾回收机制,其实 PHP 也有相应的处理机制,当然,很多 PHPer 可能从来没接触过,今天我们就来探讨一下这方面的内容。

PHP 的垃圾回收算法

在之前的文章中,我们有介绍过引用计数的概念 。在 PHP5.3 之前,PHP 的垃圾回收机制非常简单,就是把 refcount 为0的全部清理回收掉,在底层也就是 free 掉了。但是这种方式会带来一个问题,也就是我们在引用计数这篇文章中说过的循环引用,这种引用问题通过普通的判断 refcount 的方式是无法回收的。所以在 PHP5.3 之前,循环引用是会造成内存泄露的。

之所以强调版本,那是因为在 5.3 之后,PHP 改进了垃圾回收的算法,使这种循环引用得到了解决。(当然,我们在日常开发中尽量要避免这种循环引用的问题)。具体算法我们引用官方的图片:

在官方文档中有详尽的解释,不过还是会看得很懵逼。我们就用简单的语言(说人话)来描述这个过程。

首先,我们有个根缓冲区的概念,就是图中的 root 。在底层通过一系列看不懂搞不明白的算法我们能找到每个变量的一个可能根。PHP 会将变量的可能根放入根缓冲区。

当根缓冲区满了的时候,一般这个默认值是10000,需要修改源码重新编译才能修改这个值。PHP 就会启动垃圾回收机制,从根缓冲区中按照深度遍历的算法来查找所有的和这个可能根相关的变量,并将某一个可能根找到的变量的 refcount 减1,做一个标记当前这个"已减"。

然后再次深度遍历,如果 refcount 不是0的,就加1,如果是0的就保持不变。

接着清除根缓冲区中的所有可能根,清除而不是删除。然后清理释放所有的 refcount 为0的变量内容。

是不是已经懵逼了?其实我也很懵逼,都不知道这段是怎么写下来的....

记住几个要点就可以对付面试并秒杀大部分人了。

  • PHP5.3 后并不是直接看每个变量的 refcount 是否为0了
  • 使用的算法是深度遍历,有个根缓冲区,根据它来清理,具体算法需要比较扎实的 C 和算法基础,学源码的时候再好好研究吧
  • 5.3 之后用算法解决了循环引用的问题
  • 内存泄露值会保持在某一个范围,不会出现立即大范围崩溃的情况

垃圾回收对性能的影响

前文说过,垃圾回收在根缓冲区满了之后会马上执行。其中也会进行两次的深度遍历,这就不可避免的带来了性能的消耗。毕竟算法的执行都是需要耗时的。不过相对于内存溢出这种毁灭性的错误来说,垃圾回收带来的性能损耗基本上是可以忽略不计的。

到此,相信大家对"PHP垃圾回收机制的简单讲解"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

垃圾 算法 机制 缓冲区 缓冲 内存 内容 变量 语言 问题 循环 时候 深度 也就是 就是 底层 性能 处理 大部分 官方 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 实用网络技术课后感 网络安全伴我成长手抄报图片视频 计算机网络技术毕业生数目 DNS服务器请填什么数字 ibm服务器brd黄灯亮 国家网络安全产业园四季青 国家对运营商的网络安全要求 网站数据库还用备案吗 济南万宇众闻互联网科技 5G上层协议软件开发 ems服务器是什么的缩写 网络安全大赛是打游戏比赛吗 国家在数据库温度有多少 海康监控重启服务器命令 萝岗区软件开发就业 网络技术支持是前端还是后台 电子商务网络技术基础期末题 系统数据是如何跟数据库进行交互 php输出数据库照片的语句 庆阳市环县网络安全办公室电话 我的世界国行switch服务器 svn用到的数据库 公网映射网络安全 绿书签行动网络安全主题画 数据库选中语句 ems服务器是什么的缩写 萝岗区软件开发就业 计算机网络技术套题 金华嵌入式软件开发教程 数据中心网络安全应急响应
0