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 之后和算法解决了循环引用的问题
- 内存泄露值会保持在某一个范围,不会出现立即大范围崩溃的情况
垃圾回收对性能的影响
前文说过,垃圾回收在根缓冲区满了之后会马上执行。其中也会进行两次的深度遍历,这就不可避免的带来了性能的消耗。毕竟算法的执行都是需要耗时的。不过相对于内存溢出这种毁灭性的错误来说,垃圾回收带来的性能损耗基本上是可以忽略不计的。
总结
垃圾回收的内容其实我们只需要记住几个关键点就可以了,具体的核心算法和内容是需要在更深入的研究源码后才能完全了解的,当然,这也是我们学习的目标,之后也一定会涉猎源码底层的相关内容,就让我们拭目以待吧!
参考文档:
https://www.php.net/manual/zh/features.gc.collecting-cycles.php
https://www.php.net/manual/zh/features.gc.performance-considerations.php
https://www.cnblogs.com/lishanlei/p/9852274.html
https://www.cnblogs.com/lovehappying/p/3679356.html
PHP垃圾回收机制的一些浅薄理解的更多相关文章
- Java 垃圾回收机制(早期版本)
Java 垃圾回收机制在我们普通理解来看,应该视为一种低优先级的后台进程来实现的,其实早期版本的Java虚拟机并非以这种方式实现的. 先从一种很简单的垃圾回收方式开始. 引用计数 引用计数是一种简单但 ...
- 命名空间、作用域、LEGB法则、垃圾回收机制
一.命名空间.作用域.LEGB法则. 1.命名空间和作用域 : 命名空间:变量名称与值的映射关系 作用域:变量作用的区域,即范围. 注意:class/def/模块会产生作用域:分支语句,循环语句,异常 ...
- 【转】深入理解 Java 垃圾回收机制
深入理解 Java 垃圾回收机制 一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再 ...
- 深入理解java垃圾回收机制
深入理解java垃圾回收机制---- 一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再 ...
- 理解Android Java垃圾回收机制
Jvm(Java虚拟机)内存模型 从Jvm内存模型中入手对于理解GC会有很大的帮助,不过这里只需要了解一个大概,说多了反而混淆视线. Jvm(Java虚拟机)主要管理两种类型内存:堆和非堆.堆是运行时 ...
- PHP垃圾回收机制理解
使用的是"引用计数"方式进行回收.简单地理解的话,就是每个分配的内存区域都有一个计数器,记录有多少个变量指针指向这片内存.当指向该片内存的指针数量为0,那么该片内存区域就可以被回收 ...
- 理解PHP的垃圾回收机制
什么是垃圾回收机制 使用的是“引用计数”方式进行回收.简单地理解的话,就是每个分配的内存区域都有一个计数器,记录有多少个变量指针指向这片内存.当指向该片内存的指针数量为0,那么该片内存区域就可以被回收 ...
- 深入理解 Java 垃圾回收机制
深入理解 Java 垃圾回收机制 一:垃圾回收机制的意义 java 语言中一个显著的特点就是引入了java回收机制,是c++程序员最头疼的内存管理的问题迎刃而解,它使得java程序员 ...
- [Java] 理解JVM之三:垃圾回收机制
JVM内存中的各个区域都会回收吗? 首先我们知道 Java 栈和本地方法栈在方法执行完成后对应的栈帧就立刻出栈销毁,两者的回收率可以认为是100%:Java 堆中的对象在没有被引用后,即使用完成后会被 ...
随机推荐
- git config 配置简写命令
在多人协作开发时,一般用git来进行代码管理. git有一些命令如:git pull . git push等等,这些命令可以设置alias,也就是缩写. 如:git pull 是 git pl, gi ...
- 【文件格式探究】EP.1 对ePub文件格式的初探
这是"文件格式探究"专题的第 1 期--初探 "ePub" 文件格式.这个专题将会给各位读者呈现笔者探索各种文件格式的过程,具体则是文件的内容是如何呈现出来的. ...
- noip12
T1 类似于昨天的t3,先用单调栈求出管控区间,然后暴力求解30pts 我没取模还没开longlong,然后就爆0了 正解: 仍然是用单调栈求一下区间,用线段树维护一下余数,对于i所对应的区间\([l ...
- java操作excel 工具类
java操作excel 可参考https://blog.csdn.net/xunwei0303/article/details/53213130 直接上代码: 一.java生成excel文件: pac ...
- VMware中安装CentOS Linux release 7.4.1708 (Core)
本篇文章主要介绍了VMware安装Centos7超详细过程(图文),具有一定的参考价值,感兴趣的小伙伴们可以参考一下 1.软硬件准备 软件:推荐使用VMwear,我用的是VMwear 12 镜像:Ce ...
- 工具库用久了,你还会原生操作 Cookie 吗?
用得好了,工具库和框架确实是一大助力,但就怕我们会因此习惯了走捷径,而忘了自己的根本依靠是什么. 前言 前端技术的飞速发展,给从业人员不可避免地带来了"疲劳"感,我们常常会感叹学不 ...
- netty系列之:轻轻松松搭个支持中文的服务器
目录 简介 netty的HTTP支持 netty中使用HTTP的原理 100 (Continue) Status 为netty搭建HTTP服务器 总结 简介 之前讲了那么多关于netty的文章,都是讲 ...
- Spring笔记(2)
一.AOP简介 1.概念: 面向切面编程(Aspect-Oriented Programming),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善. ...
- vue 上传头像悬浮显示文字
template部分: 头像外部加一个 div <div class="user-info-head"> </div> css 部分 <style ...
- Python之uiautomation模块-获取CMD窗口中所打印的文字信息
当我们想以自动化的方式操作软件,以提高办公或测试效率时,有许多成熟的工具,比如针对Web端应用的Selenium.针对移动端应用的Appium.那么,PC端(Windows)桌面应用,又改如何处理呢? ...