一直对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. leetcode1143 Longest Common Subsequence

    """ Given two strings text1 and text2, return the length of their longest common subs ...

  2. spring boot rest api exception解决方案

    1.控制器级别@ExceptionHandler public class FooController{           //...     @ExceptionHandler({ CustomE ...

  3. git仓库拆分

    例如: # 这就是那个大仓库 big-project $ git clone git@github.com:tom/big-project.git $ cd big-project # 把所有 `co ...

  4. js实现二叉查找树

    二叉树的特点:   像一颗树一样,从顶端往下延伸,最顶端的为根节点,每个节点下面子节点的数不超过两个,没有任何子节点的节点被称为叶子节点, 除了根节点和叶子节点的被称为中间节点. 二叉查找树: 每个节 ...

  5. 【转载】Asp .Net Web Api路由路径问题

    原文章地址:https://www.cnblogs.com/devtester/p/8897302.html MVC也好,WebAPI也好,据我所知,有部分人是因为复杂的路由,而不想去学的.曾经见过一 ...

  6. maven-本地安装jar包

    maven 安装本地jar包,通过install插件的install-file mojo进行工作,具体可通过如下命令进行查看 mvn help:describe -Dplugin=install -D ...

  7. Vue.js(25)之 vue全局配置api介绍

    本文介绍的全局api并不在Vue的构造函数内,而是在Vue构造器外面提供这些方法,让我们扩展新功能. 1. vue.extend(options) 参考:https://www.w3cplus.com ...

  8. Bulma CSS - CSS类

    Bulma CSS框架教程 Bulma CSS – 简介 Bulma CSS – 开始 Bulma CSS – CSS类 Bulma CSS – 模块化 Bulma CSS – 响应式 Bulma是一 ...

  9. Django static配置

    STATIC_URL = '/static/' # HTML中使用的静态文件夹前缀 STATICFILES_DIRS = [ os.path.join(BASE_DIR, "static&q ...

  10. Mysql: if 结构

    if结构 语法 if  条件1  then  语句1; elseif   条件2   then  语句2; ... else 语句n;   # 可以不写 应用场合:应用在begin end 中 SEL ...