一直对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. OPENCV2.46 与2.4.10以上版本的区别

    本人系统环境: CPU:Intel(R)Core(TM) i3-4160 CPU @ 3.60GHz 内存:4G 接两路摄像机,一路海康,一路艾普视达.CPU占有率95%.发现opencv2.4.10 ...

  2. TS-Lint 安装方法

    1  在 Visual Studio Extensions  里下载 TSLint  2  在项目根目录下放 tslint.json 文件 (里面的规则定死就好 我认为没有特别大的意义)

  3. reduce()、filter()、map()、some()、every()、...展开属性

    reduce().filter().map().some().every()....展开属性   这些概念属于es5.es6中的语法,跟react+redux并没有什么联系,我们直接在https:// ...

  4. 《Python爬虫技术:深入理解原理、技术与开发》已经出版,送Python基础视频课程

    好消息,<Python爬虫技术:深入理解原理.技术与开发>已经出版!!!   JetBrains官方推荐图书!JetBrains官大中华区市场部经理赵磊作序!送Python基础视频课程!J ...

  5. 129-PHP子类不能访问父类private修饰的类成员

    <?php class father{ //定义father类 //定义private修饰的类成员和方法 private $hair='curly hair'; private function ...

  6. HZNU-ACM寒假集训Day12小结 数论入门

    符号说明 a|b      a整除b (a,b)    a与b的最大公因数 [a,b]     a与b的最小公倍数 pα||a    pα|a但pα+1∤a a≡b(mod m) a与b对模m同余 a ...

  7. hdu 1160 上升序列 dp

    FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  8. main:处理命令行选项

    #include<iostream> #include<stdlib.h> using namespace std; int main(int argc, char** arg ...

  9. js原型链理解(2)--原型链继承

    1.原型链继承 2.constructor stealing(构造借用) 3.组合继承 js中的原型链继承,运用的js原型链中的__proto__. function Super(){ this.se ...

  10. css渐变实现

    body{ width: 100%; height: 100%; overflow: hidden; } *{ margin: 0px; padding: 0px; font-size: 0px; } ...