PHP的垃圾回收机制是5.3版本以上的东西,官方给出的解释是,当结构体(zval)的指向计数(refcount)减少到非0时,才会进入垃圾缓冲区(buffer),当缓冲区到达临界值(默认是10000,PHP7.3的临界值触发是100)时,会触发垃圾回收算法,该算法对缓冲区的疑似垃圾结构体进行遍历,把每个结构体的指向计数(refcount)减1,然后判断其(refcount)是否为0,如果是的话,就判定这个结构体是垃圾,并销毁。

可是经过调试,例如:

$a = ['string'];
$b = &$a;
xdebug_debug_zval('a');

会返回

a:
(refcount=2, is_ref=1)
array (size=1)0 => (refcount=1, is_ref=0)string 'string' (length=6)

然后

$a = ['string'];
$b = &$a;
xdebug_debug_zval('a');
echo PHP_EOL;
unset($a);
xdebug_debug_zval('b');

返回

a:
(refcount=2, is_ref=1)
array (size=1)0 => (refcount=1, is_ref=0)string 'string' (length=6)
b:
(refcount=1, is_ref=1)
array (size=1)0 => (refcount=1, is_ref=0)string 'string' (length=6)

此时结构体

b:
(refcount=1, is_ref=1)
array (size=1)
0 => (refcount=1, is_ref=0)string ‘string’ (length=6)

的指向计数(refcount=1),按照官方的解释,这个结构体会被放到垃圾缓冲区中,等缓冲区满了之后,进行遍历,refcount=1-1=0 ,最后会被销毁;然而事实并不是这样,这个结构体有没有放到缓冲区我不知道,但是一定不会被销毁。通过函数gc_collect_cycles()手动回收时,返回0,证明没有被销毁,况且如果是销毁了,那就不适了,因为该结构体还有$b符号指向它,要调用的时候怎么办?PHP开发者不会想不到这个问题。因此,前面官方给出的解释并不详细,经过一段时间的研究和调试,先看类似官方给出的实例代码

$a = array('w');
$a[1] = &$a;
xdebug_debug_zval('a');
echo PHP_EOL;
unset($a);
xdebug_debug_zval('a');
echo PHP_EOL;
var_dump(gc_collect_cycles());//手动进行垃圾回收,返回回收的垃圾数量

返回

a:
(refcount=2, is_ref=1)
array (size=2)0 => (refcount=1, is_ref=0)string 'w' (length=1)1 => (refcount=2, is_ref=1)&array<
a: no such symbol
D:\www\test\GC.php:82:int 2

由此可得,我个人对php垃圾回收机制的理解是:
当数组或对象的指向计数(refcount)减少到非0,并且在符号表中没有任何符号映射该数组或对象时,才会产生垃圾周期,也就是说该结构体才会被放在垃圾缓冲区,被当做疑似垃圾看待,等到缓冲区达到临界值时,触发回收算法,对疑似垃圾的结构体进行遍历,将指向计数(refcount)减1,然后判断refcount是否为0,如果是的话就确认结构体为垃圾,最后进行销毁,释放内存空间。

总结:
PHP5.3以上版本加入的垃圾回收机制,是为了解决循环引用造成内存泄漏的,因此在开发工作的中,循环数组时要慎用引用,并养成unset释放空间的习惯。

php的垃圾回收机制相关推荐

  1. 详细介绍Java垃圾回收机制

    垃圾收集GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内部运行机制上看,Java的垃圾回收原理与机 ...

  2. JAVA中的垃圾回收机制以及其在android开发中的作用

    http://blog.csdn.net/xieqibao/article/details/6707519 这篇文章概述了JAVA中运行时数据的结构,以及垃圾回收机制的作用.在后半部分,描述了如何检测 ...

  3. 图解 Java 垃圾回收机制,写得非常好!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 原文:https://www.oracle.com/webfold ...

  4. 详解JVM内存管理与垃圾回收机制2 - 何为垃圾

    随着编程语言的发展,GC的功能不断增强,性能也不断提高,作为语言背后的无名英雄,GC离我们的工作似乎越来越远.作为Java程序员,对这一点也许会有更深的体会,我们不需要了解太多与GC相关的知识,就能很 ...

  5. Python3.5源码分析-垃圾回收机制

    Python3源码分析 本文环境python3.5.2. 参考书籍<<Python源码剖析>> python官网 Python3的垃圾回收概述 随着软硬件的发展,大多数语言都已 ...

  6. 深入浅出Java垃圾回收机制

    2019独角兽企业重金招聘Python工程师标准>>> 对于Java开发人员来说,了解垃圾回收机制(GC)有哪些好处呢?首先可以满足作为一名软件工程师的求知欲,其次,深入了解GC如何 ...

  7. Java 垃圾回收机制,13张图给你讲清楚!

    作者:Rhys_Lee 等等等 https://blog.csdn.net/zl1zl2zl3/article/details/90904088 什么是自动垃圾回收? 第一步:标记 第二步:清除 压缩 ...

  8. 安卓 java内存碎片_理解Android Java垃圾回收机制

    Jvm(Java虚拟机)内存模型 从Jvm内存模型中入手对于理解GC会有很大的帮助,不过这里只需要了解一个大概,说多了反而混淆视线. Jvm(Java虚拟机)主要管理两种类型内存:堆和非堆. 堆是运行 ...

  9. java垃圾回收机制_笔记 | Java垃圾回收机制

    本文经授权转载自程序员杂货铺(ID:speakFramework) 垃圾回收 最近上海的小伙伴是不是要被强垃圾分类搞疯了???哈哈哈哈 上海是个走在前列的城市啊,不光骑自行车闯红灯要被罚钱,垃圾不分类 ...

  10. JVM的垃圾回收机制详解和调优

    1.JVM的gc概述 gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存.java语言并不要求jvm有gc,也没有规定gc如何工作.不过常用的jvm都有gc,而且大多数gc都使用类似的 ...

最新文章

  1. python实现反转链表讲解_基于Python实现2种反转链表方法代码实例
  2. 输入输出 原理 java_java输入输出,书写规范,运行原理,跨平台原理(复习)...
  3. linux 定时器 crontab 实例 计划任务 定时任务
  4. Stereo Matching 立体匹配学习资料
  5. 读史以明志,把握好自己的明天
  6. 短板效应C++代码实现
  7. antd 嵌套子表格_大型前端项目架构优化探索之路腾讯文档表格
  8. C语言Catalan number卡特兰数(使用n个键可以搜索多少个二叉搜索树)的算法(附完整源码)
  9. react-router5.x 的配置及其页面跳转方法和js跳转方法
  10. CentOS学习笔记--程序管理
  11. 【渝粤题库】广东开放大学 英语语音与听说 形成性考核
  12. 计算机初级考试题库网络管理,计算机基础考试题库(含答案)
  13. 计算机网络之数据链路层:11、CSMA/CD协议-随机访问介质访问控制
  14. python中list怎么用_python中list(列表)的使用方法总结(图文)
  15. 本周三、四两场直播丨达梦 vs. Oracle,从快速入门到性能分析优化
  16. C#中public函数的用法_python中的lambda函数用法
  17. easyicon-----一个非常好用的找图标的网站
  18. C# NamePipe使用小结
  19. 【运动学】基于matlab GUI不等半径泊车方法仿真【含Matlab源码 691期】
  20. R语言利用openxlsx包输出EXCEL报告

热门文章

  1. 华为云虚拟主机的防火墙设置
  2. python文献检索工具与技巧答案_文献检索(答案)
  3. myeclipse未能启动服务器,myeclipse启动服务器时,tomcat出错问题
  4. vnc远程软件,盘点六款你值得拥有的vnc远程软件
  5. 物联网共享单车有什么物联技术?
  6. mysql视图代码_mysql创建视图的实例代码
  7. 利用爬虫数据做的研究_利用研究周增强数据科学能力
  8. mysql如何创建全文索引_从零开始学习MySQL全文索引
  9. 蓝牙加密方案,蓝牙方案,蓝牙usbkey,蓝牙key,蓝牙U盾,蓝牙智能卡(公交卡等CPU卡),蓝牙身份认证产品分享,蓝牙公交卡,蓝牙会员卡
  10. excel中相对引用、绝对引用、混合引用