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

  介绍

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

<节>,   ,

垃圾回收是什么东西?

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

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

,

PHP的垃圾回收算法

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

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

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

<图数据工具=癿dnice编辑器”>

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

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

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

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

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

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

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

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

垃圾回收对性能的影响

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

,

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

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