一直对php的垃圾回收机制不明不白故自己开贴记录下。

首先,说到垃圾回收,得先知道什么情况下才能产生垃圾。

 如果一个变量refcount在增加,说明在被使用,不是垃圾。

 如果一个变量的refcount减少到0了,说明可以被释放,不是垃圾。

 只有一个变量的refcount在减少,但是减不到0的情况,才是垃圾。

 一个建立出来后产生的变量容器是放到一个统一的大环境下的,但是array和object稍微有点不同他们本身的变量是在刚才说的大环境下的,但是比如数组的$a[1] = &$a,array和object他们的子类产生的变量容器是存放在这个数组$a自己维护的一个环境下 的,这个时候如果unset($a)之后, 这个is_ref字段还会是1,然后refcount也会是1。

(refcount=1, is_ref=1)=array (

   0 => (refcount=1, is_ref=0)='one',
1 => (refcount=1, is_ref=1)=... #...的意思是指向了递归操作了,指向了原本的数组$a
)

(php通过符号表存储变量符号,全局有一个符号表,array和object的子结构有自己维护的符号表) 尽管不再有任何符号指向$a产生的变量容器,因为unset掉了,但是$a之前自己环境里边还在用这个变量容器,所以垃圾就这么产生了,回收不掉。因为没有别的符号指向他了,没办法再unset($a[1])了。
这种造成的内存泄漏吧,平常php脚本执行完毕也就自己关了,但是难免有人用php写一些守护进程很长时间不关闭的程序,就会造成大量内存泄漏。 其次,垃圾怎么被回收
PHP首先会找到这些疑似垃圾,官网上翻成了意思根,怎么找到的太复杂,我个人认为我暂时知道他能找到这些就可以,后续再深入研究。找到这些疑似垃圾的zval之后,把这些疑似垃圾放到
一个根缓冲区,这个根缓冲区能接受的最大疑似垃圾数量默认是10000,(ps:如果要改这个值,需要改php源码并且重新编译后生效,改哪个文件请google)。只有这个根缓冲区满了,装不下了,才开始进行垃圾回收。 说到重点了,怎么删,根据我的理解,分3步: 0.把这些疑似垃圾的refcount这个值全减1,(这块强调下,不是单纯的减1,比如 $a[1] = &$a, $a[2] = &$a , 这种多次引用的,是把每次引用全删掉,所以这种情况下refcount减的是2)为了避免不同根缓冲区都对这个zval做了操作,
所有引用删除也就是减1后,php会标记一下这个zval的引用保证不能再次被删除. 1.再次遍历这些所有的疑似垃圾zval,如果他的refcount 加 1后 不为0,则对其进行refcount 加 1操作, 否则的话,就让他保持0.
2.前两步已经算是把垃圾给找出来了,这一步算是清理,首先,清空这个跟缓存区,循环利用嘛,然后对上一步中,refcount为0的这些真垃圾进行删除销毁,并且收回内存。

我理解这个机制呢,能把内存控制在一个还算理想并且能接收的阈值以下。可以解决循环引用导致的内存泄漏问题。

 

对PHP-GC(垃圾回收)的一点理解的更多相关文章

  1. JVM构架、GC垃圾回收机制的理解

     JVM是Java Virtual Machine(Java虚拟机)的缩写 1.程序计数器 它的作用可以看做是当前线程所执行的字节码的行号指示器. 每个线程都有一个程序计算器,就是一个指针,指向方法区 ...

  2. Java学习之二(线程(了解) JVM GC 垃圾回收)

    线程与进程(了解)→JVM→字节码→GC 一.程序 = 算法 + 数据结构(大佬) 二.程序 = 框架 + 业务逻辑(现实) 1.线程与进程.同步与异步 1.1进程是什么? 进程就是操作系统控制的基本 ...

  3. JVM虚拟机 与 GC 垃圾回收

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.JVM体系结构概述 1.JVM 与系统.硬件 ​ JVM是运行在操作系统之上的,它与硬件没有直接的交 ...

  4. GC垃圾回收

    我们在开发需求的时候,可能很少关注到垃圾回收,因为我们绝大多数的时候都是使用的托管资源,托管资源的内存回收.net已经帮我们做了,但是.net的内存回收不是实时的,所以我们还是要关注下.net的垃圾回 ...

  5. JVM学习02:GC垃圾回收和内存分配

    JVM学习02:GC垃圾回收和内存分配 写在前面:本系列分享主要参考资料是  周志明老师的<深入理解Java虚拟机>第二版. GC垃圾回收和内存分配知识要点Xmind梳理 案例分析1-(G ...

  6. Java虚拟机笔记(二):GC垃圾回收和对象的引用

    为什么要了解GC 我们都知道Java开发者在开发过程中是不需要关心对象的回收的,因为Java虚拟机的原因,它会自动回收那些失效的垃圾对象.那我们为什么还要去了解GC和内存分配呢? 答案很简单:当我们需 ...

  7. JVM架构和GC垃圾回收机制

    深入理解系列之JDK8下JVM虚拟机(1)——JVM内存组成 https://blog.csdn.net/u011552404/article/details/80306316 JVM架构和GC垃圾回 ...

  8. java面试题之----JVM架构和GC垃圾回收机制详解

    JVM架构和GC垃圾回收机制详解 jvm,jre,jdk三者之间的关系 JRE (Java Run Environment):JRE包含了java底层的类库,该类库是由c/c++编写实现的 JDK ( ...

  9. 面试官,不要再问我“Java GC垃圾回收机制”了

    Java GC垃圾回收几乎是面试必问的JVM问题之一,本篇文章带领大家了解Java GC的底层原理,图文并茂,突破学习及面试瓶颈. 楔子-JVM内存结构补充 在上篇<JVM之内存结构详解> ...

  10. 通俗易懂.NET GC垃圾回收机制(适用于小白面试,大牛勿喷)

    情景:你接到xx公司面试邀请,你怀着激动忐忑的心坐在对方公司会议室,想着等会的技术面试.技术总监此时走来,与你简单交谈后.... 技术:你对GC垃圾回收机制了解的怎么样? 你:还行,有简单了解过. 技 ...

随机推荐

  1. 安装mysql server5.5 到start service未响应解决方法

    打开C盘,然后修改    "组织"  =>  "查看"(如下图)  里面的  "隐藏受保护的操作系统文件"  (系统这是会弹出警告,不 ...

  2. maven详解 之仓库

    Maven仓库分类   MAVEN仓库分类 Maven仓库分为:本地仓库+远程仓库两大类 远程仓库又分为:中央仓库+私服+其它公共远程仓库 1,在Maven中,任何一个依赖.插件或者项目构建的输出,都 ...

  3. 深度学习之常用linux命令总结

    深度学习中常用linux命令总结 1.创建文件夹 mkdir 文件名2.删除文件 rm -d 目录名 #删除一个空目录 rmdir 目录名 #删除一个空目录 rm -r 目录名 #删除一个非空目录 r ...

  4. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-off

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  5. 使用Python绘制漫步图

    代码如下: import matplotlib.pyplot as plt from random import choice class RandomWalk(): def __init__(sel ...

  6. 基于共享内存、信号、命名管道和Select模型实现聊天窗口

    问题模型 A.B两个进程通过管道通信,A 进程每次接收到的数据通过共享内存传递给A1进程显示,同理,B进程每次接收到的数据通过共享内存传递给B1进程显示: 对于A.B 进程,采用ctrl+c(实际为S ...

  7. 地图js及json包

    echarts github上的地图js及json包:https://github.com/apache/incubator-echarts/tree/master/map 上面链接没有县及的地图js ...

  8. 141-PHP类的抽象方法和继承实例(一)

    <?php abstract class ren{ //定义人类 //定义成员属性 protected $name=''; protected $age=0; //定义成员方法 public f ...

  9. 08 SSM整合案例(企业权限管理系统):08.权限控制

    04.AdminLTE的基本介绍 05.SSM整合案例的基本介绍 06.产品操作 07.订单操作 08.权限控制 09.用户操作 10.权限关联与控制 11.AOP日志 08.权限控制 SSM权限操作 ...

  10. HDU - 2819 Swap(二分匹配)

    题意:交换任意两行或两列,使主对角线全为1. 分析: 1.主对角线都为1,可知最终,第一行与第一列匹配,第二行与第二列匹配,……. 2.根据初始给定的矩阵,若Aij = 1,则说明第i行与第j列匹配, ...