对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垃圾回收机制了解的怎么样? 你:还行,有简单了解过. 技 ...
随机推荐
- 安装mysql server5.5 到start service未响应解决方法
打开C盘,然后修改 "组织" => "查看"(如下图) 里面的 "隐藏受保护的操作系统文件" (系统这是会弹出警告,不 ...
- maven详解 之仓库
Maven仓库分类 MAVEN仓库分类 Maven仓库分为:本地仓库+远程仓库两大类 远程仓库又分为:中央仓库+私服+其它公共远程仓库 1,在Maven中,任何一个依赖.插件或者项目构建的输出,都 ...
- 深度学习之常用linux命令总结
深度学习中常用linux命令总结 1.创建文件夹 mkdir 文件名2.删除文件 rm -d 目录名 #删除一个空目录 rmdir 目录名 #删除一个空目录 rm -r 目录名 #删除一个非空目录 r ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-off
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- 使用Python绘制漫步图
代码如下: import matplotlib.pyplot as plt from random import choice class RandomWalk(): def __init__(sel ...
- 基于共享内存、信号、命名管道和Select模型实现聊天窗口
问题模型 A.B两个进程通过管道通信,A 进程每次接收到的数据通过共享内存传递给A1进程显示,同理,B进程每次接收到的数据通过共享内存传递给B1进程显示: 对于A.B 进程,采用ctrl+c(实际为S ...
- 地图js及json包
echarts github上的地图js及json包:https://github.com/apache/incubator-echarts/tree/master/map 上面链接没有县及的地图js ...
- 141-PHP类的抽象方法和继承实例(一)
<?php abstract class ren{ //定义人类 //定义成员属性 protected $name=''; protected $age=0; //定义成员方法 public f ...
- 08 SSM整合案例(企业权限管理系统):08.权限控制
04.AdminLTE的基本介绍 05.SSM整合案例的基本介绍 06.产品操作 07.订单操作 08.权限控制 09.用户操作 10.权限关联与控制 11.AOP日志 08.权限控制 SSM权限操作 ...
- HDU - 2819 Swap(二分匹配)
题意:交换任意两行或两列,使主对角线全为1. 分析: 1.主对角线都为1,可知最终,第一行与第一列匹配,第二行与第二列匹配,……. 2.根据初始给定的矩阵,若Aij = 1,则说明第i行与第j列匹配, ...