对PHP-GC(垃圾回收)的一点理解
一直对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(垃圾回收)的一点理解的更多相关文章
- JVM构架、GC垃圾回收机制的理解
JVM是Java Virtual Machine(Java虚拟机)的缩写 1.程序计数器 它的作用可以看做是当前线程所执行的字节码的行号指示器. 每个线程都有一个程序计算器,就是一个指针,指向方法区 ...
- Java学习之二(线程(了解) JVM GC 垃圾回收)
线程与进程(了解)→JVM→字节码→GC 一.程序 = 算法 + 数据结构(大佬) 二.程序 = 框架 + 业务逻辑(现实) 1.线程与进程.同步与异步 1.1进程是什么? 进程就是操作系统控制的基本 ...
- JVM虚拟机 与 GC 垃圾回收
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.JVM体系结构概述 1.JVM 与系统.硬件 JVM是运行在操作系统之上的,它与硬件没有直接的交 ...
- GC垃圾回收
我们在开发需求的时候,可能很少关注到垃圾回收,因为我们绝大多数的时候都是使用的托管资源,托管资源的内存回收.net已经帮我们做了,但是.net的内存回收不是实时的,所以我们还是要关注下.net的垃圾回 ...
- JVM学习02:GC垃圾回收和内存分配
JVM学习02:GC垃圾回收和内存分配 写在前面:本系列分享主要参考资料是 周志明老师的<深入理解Java虚拟机>第二版. GC垃圾回收和内存分配知识要点Xmind梳理 案例分析1-(G ...
- Java虚拟机笔记(二):GC垃圾回收和对象的引用
为什么要了解GC 我们都知道Java开发者在开发过程中是不需要关心对象的回收的,因为Java虚拟机的原因,它会自动回收那些失效的垃圾对象.那我们为什么还要去了解GC和内存分配呢? 答案很简单:当我们需 ...
- JVM架构和GC垃圾回收机制
深入理解系列之JDK8下JVM虚拟机(1)——JVM内存组成 https://blog.csdn.net/u011552404/article/details/80306316 JVM架构和GC垃圾回 ...
- java面试题之----JVM架构和GC垃圾回收机制详解
JVM架构和GC垃圾回收机制详解 jvm,jre,jdk三者之间的关系 JRE (Java Run Environment):JRE包含了java底层的类库,该类库是由c/c++编写实现的 JDK ( ...
- 面试官,不要再问我“Java GC垃圾回收机制”了
Java GC垃圾回收几乎是面试必问的JVM问题之一,本篇文章带领大家了解Java GC的底层原理,图文并茂,突破学习及面试瓶颈. 楔子-JVM内存结构补充 在上篇<JVM之内存结构详解> ...
- 通俗易懂.NET GC垃圾回收机制(适用于小白面试,大牛勿喷)
情景:你接到xx公司面试邀请,你怀着激动忐忑的心坐在对方公司会议室,想着等会的技术面试.技术总监此时走来,与你简单交谈后.... 技术:你对GC垃圾回收机制了解的怎么样? 你:还行,有简单了解过. 技 ...
随机推荐
- Fr3设置图片打印
见 fr3的文件内容,为xml <?xml version="1.0" encoding="utf-8"?> <TfrxReport Vers ...
- SPOJ_DSUBSEQ Distinct Subsequences
统计一个只由大写字母构成的字符串的,子串数目,这里指的是子串不是子序列,可以不连续,请注意 然后我按照计数DP的思想,dp[i][j]表示长度为i的子串,最后一个字母为j 然后为了去重,每一次dp的时 ...
- 事件时间(event time)与水印(watermark)
事件时间和水印诞生的背景 在实际的流式计算中数据到来的顺序对计算结果的正确性有至关重要的影响 比如:某数据源中的某些数据由于某种原因(如:网络原因,外部存储自身原因)会有2秒的延时,也就是在实际时间的 ...
- 压测工具siege和wrk
siege压测工具 安装: wget http://download.joedog.org/siege/siege-3.0.8.tar.gz cd siege-3.0.8 ./configure ma ...
- MySQLWorkbench注释
不改变快捷键配置文件基础上 1. 通过菜单操作 Edit -> Format -> Un/comment 2. 键盘 (Windows 10, 其他操作系统未试过) Ctrl + / ( ...
- QT多线程之---moveToThread用法
在gui编程里,一个子函数的运行时间可能过长,界面就处于假死状态,原因是窗口是一个线程,子函数也在这个线程里,一些事件也要在这个线程里处理. 如果子函数运行时间过长,系统没有办法调用事件监听循环,gu ...
- sql 左联 右联 内联的区别
如有表a(col1,col2),a,1b,1 b(col1,col2)a,3c,2 内部联接是指只返回符合联接条件的资料,如select * from a join b on a.col1 = b.c ...
- Ubuntu 18.04 配置 adb
Reference1: https://www.jianshu.com/p/377c6fb6e590 Reference2: https://blog.csdn.net/ppggxn/articl ...
- 22 ~ express ~ 内容评论实现
1,使用 ajax 提交评论内容 给 api.js 2,数据库 contents 增加评论字段 3,后台路由 api.js 接收并完成存储 /** 增加评论(用户,内容,时间) */ router.p ...
- storm on yarn安装时 提交到yarn失败 failed
最近在部署storm on yarn ,部署参考文章 http://www.tuicool.com/articles/BFr2Yvhttp://blog.csdn.net/jiushuai/artic ...