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 之后用算法解决了循环引用的问题
  • 内存泄露值会保持在某一个范围,不会出现立即大范围崩溃的情况

垃圾回收对性能的影响

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

总结

垃圾回收的内容其实我们只需要记住几个关键点就可以了,具体的核心算法和内容是需要在更深入的研究源码后才能完全了解的,当然,这也是我们学习的目标,之后也一定会涉猎源码底层的相关内容,就让我们拭目以待吧!

参考文档:

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

(0)

相关推荐

  • 火山中文编程:012如何删除变量及垃圾回收机制介绍

    第一种方法,鼠标选中需要删除的变量,当鼠标选中后,选中的变量会高亮显示,这时候直接按键盘DELETE键即可快速删除变量,这种方法只有选中变量表格后才能使用,否则无效. 第二种方法删除变量的方法,鼠标放 ...

  • 说说Python中的垃圾回收机制?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

  • [PHP小课堂]PHP垃圾回收机制的一些浅薄理解

    [PHP小课堂]PHP垃圾回收机制的一些浅薄理解 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[xiaoyuezigonggong/149844827]免费得PHP.项目管理学习资料 ...

  • 面试题-python 垃圾回收机制?

    前言 简历上写着熟悉 python 面试官上来就问:说下python 垃圾回收机制?一盆冷水泼过来,瞬间感觉 python 不香了. Python中,主要通过引用计数(Reference Counti ...

  • 第 111 天:Python 垃圾回收机制

    众所周知,Python 是一门面向对象语言,在 Python 的世界一切皆对象.所以一切变量的本质都是对象的一个指针而已. Python 运行过程中会不停的创建各种变量,而这些变量是需要存储在内存中的 ...

  • 关于JS垃圾回收机制

    一.垃圾回收机制的必要性 由于字符串.对象和数组没有固定大小,所以当它们的大小已知时,才能对它们进行动态的存储分配.JavaScript程序每次创建字符串.数组或对象时,解释器都必须分配内存来存储那个 ...

  • 浅谈浏览器垃圾回收机制

    javaScriipt 使用垃圾回收机制来自动管理内存 js 的回收机制目前分为两种方式:1.标记清除(各大浏览器主流算法)2.引用技术 一: 标记清除 这种算法的思想是给当前不使用的值加上标记,然后 ...

  • 抽水蓄能纳入输配电价回收引发争议 到底怎么理解?

    北极星水力发电网讯:近期,国家发改委宣布将抽水蓄能纳入输配电价回收,让陷入亏损境遇的抽水蓄能投资方看到了曙光,同时也引发了一些争议. (来源:微信公众号"能见Eknower"  I ...

  • 垃圾回收算法有几种类型? 他们对应的优缺点又是什么?

    常见的垃圾回收算法有: 标记-清除算法.复制算法.标记-整理算法.分代收集算法 标记-清除算法 标记-清除算法包括两个阶段:"标记"和"清除". 标记阶段:确定 ...