广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >php中gc是什么意思
  • 927
分享到

php中gc是什么意思

phpgc垃圾回收机制 2020-07-10 08:07:42 927人浏览 猪猪侠
摘要

本教程操作环境:windows7系统、PHP7.1版、DELL G3电脑在php中,gc全称“Garbage Collection”,中文意思为“垃圾回收”,是一种动态内存管理机制。垃圾回收机制(GC)会自动释放程序不再需要的已分配的内存块

教程操作环境:windows7系统、PHP7.1版、DELL G3电脑

在php中,gc全称“Garbage Collection”,中文意思为“垃圾回收”,是一种动态内存管理机制。

垃圾回收机制(GC)会自动释放程序不再需要的已分配的内存块。自动回收内存的过程叫垃圾收集。

垃圾回收机制(GC)可以让程序员不必过分关心程序内存分配,从而将更多的精力投入到业务逻辑。

在现在的流行各种语言当中,垃圾回收机制是新一代语言所共有的特征。

垃圾的产生

php7 中复杂类型,像字符串数组、对象等的数据结构中,头部都有一个 gc, 这个 gc 的作用就是用来对垃圾回收的支持。当变量赋值、传递时,会增加 value 的引用数, unset、return 等释放变量时再减掉引用数,减掉后如果发现 refcount 变为 0 则直接释放 value,这是变量的基本回收过程。

不过有一种问题是这个机制无法解决的,就是循环引用的问题。

什么是循环引用呢? 简单说就是变量的内部里存的 value 又引用了变量自身。 这种比较经常发生在数组和对象类型的变量上。

这里先讲一下引用,即 zend_reference 这个类型,这个是 PHP7 新增的变量类型,当对变量使用 “&” 操作时,会创建新的中间结构体 zend_reference,这个结构体会真正的指向对应的 value 结构。

举个例子:

// 当进行如下赋值操作时
$a = 'hello'; // $a -> zend_string
$b = $a; // $b,$a -> zend_string
$c = &$b; // $c,$b -> zval(type = IS_REFERENCE, refcount = 2) -> zend_string

最终会变成如下这样:

1.png

即 $b 和 $c 的 zval 是通过中间结构体 zend_reference 再指向最终的 zend_string。

回到循环引用的问题,举个数组循环引用例子:

$a = [1];
$a[] = &$a;
unset($a);

使用 & 操作之后,变量 a 就变成了引用类型且引用计数 refcount 为 2,而又赋值给自己里面的元素,即变量 a 变成了自己引用自己。

具体如下如所示:

2.png

当 unset 之后就变成下图这样:

3.png

即 $a 所在的 zval 类型已经变成了 IS_UNDEF 了,zend_reference 结构体的引用计数减 1,但是仍然大于 0,这时候,这部分结构体就变成了垃圾,对此不处理的话,就可能会造成内存泄露。这里就需要垃圾收集器将这部分收集到缓冲区,之后进行回收处理。

回收过程

如果当变量的 refcount 减小后大于 0,PHP 并不会立即对这个变量进行垃圾鉴定和回收,而是放入一个缓冲区中,等这个缓冲区满了以后 (10000 个值) 再统一进行处理,加入缓冲区的是变量 zend_value 里的 gc,目前垃圾只会出现在数组和对象两种类型中,数组的情况上面已经介绍了,对象的情况则是成员属性引用对象本身导致的,其它类型不会出现这种变量中的成员引用变量自身的情况,所以垃圾回收只会处理这两种类型的变量。

gc 的结构 zend_refcounted_h 具体如下:

typedef struct _zend_refcounted_h {
    uint32_t         refcount; // 记录 zend_value 的引用数
    uNIOn {
        struct {
            zend_uchar    type,  // zend_value的类型, 与zval.u1.type一致
            zend_uchar    flags, 
            uint16_t      gc_info // GC信息,记录在 gc 池中的位置和颜色,垃圾回收的过程会用到
        } v;
        uint32_t type_info;
    } u;
} zend_refcounted_h;

一个变量只能加入一次缓冲区,为了防止重复加入,变量加入后会把 zend_refcounted_h.gc_info 置为 GC_PURPLE,即标为紫色,后续不会重复插入。

垃圾缓冲区是一个双向链表,等到缓存区满了以后则启动垃圾检查过程:遍历缓冲区,对当前变量的所有成员进行遍历,然后把成员的 refcount 减 1 (如果成员还包含子成员则也进行递归遍历,即深度优先遍历),最后再检查当前变量的引用,如果减为了 0 则为垃圾。这个算法的原理核心是:垃圾是由于成员引用自身导致的,那么就对所有的成员减一遍引用,如果发现最后变量本身的 refcount 变为了 0 则就表明其引用全部来自自身成员,即其他任何地方都不再使用它,那么它就是垃圾,需要被回收掉。反之说明不是垃圾,需要将其从缓冲区移出去。具体的过程如下:

(1) 从缓冲区链表的 roots 开始遍历,把当前 value 标为灰色 (zend_refcounted_h.gc_info 置为 GC_GREY),然后对当前 value 的成员进行深度优先遍历,把成员 value 的 refcount 减 1,并且也标为灰色;

(2) 重复遍历缓冲区链表,检查当前 value 引用是否为 0,为 0 则表示确实是垃圾,把它标为白色 (GC_WHITE),如果不为 0 则排除了引用全部来自自身成员的可能,表示还有外部的引用,并不是垃圾,这时候因为步骤 (1) 对成员进行了 refcount 减 1 操作,需要再还原回去,对所有成员进行深度遍历,把成员 refcount 加 1,同时标为黑色;

(3) 再次遍历缓冲区链表,将非 GC_WHITE 的节点从 roots 链表中移出,最终 roots 链表中全部为真正的垃圾,最后将这些垃圾清除。

--结束END--

本文标题: php中gc是什么意思

本文链接: https://www.lsjlt.com/news/1443.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • php中gc是什么意思
    本教程操作环境:windows7系统、PHP7.1版、DELL G3电脑在php中,gc全称“Garbage Collection”,中文意思为“垃圾回收”,是一种动态内存管理机制。垃圾回收机制(GC)会自动释放程序不再需要的已分配的内存块...
    99+
    2020-07-10
    php gc 垃圾回收机制
  • java中GC什么意思?
    GC(Garbage Collection)是java中的垃圾回收机制,是Java与C++/C的主要区别之一,在使用JAVA的时候,一般不需要专门编写内存回收和垃圾清理代 码。这是因为在Java虚拟机中,存在自动内存管理和垃圾清扫机制。电脑...
    99+
    2016-10-31
    java教程 java GC
  • php中=是什么意思
    本文操作环境:windows7系统、PHP7.4版、DELL G3电脑php中=是什么意思?PHP 中基础的赋值运算符是 "="。这意味着右侧赋值表达式会为左侧运算数设置值。如 z=x+y,右侧表达式为左侧运算数设置值。...
    99+
    2021-07-01
    php
  • PHP中AOP是什么意思
    小编给大家分享一下PHP中AOP是什么意思,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!什么是AOP?在应用开发中,我们经常发现需要很多功能,这些功能需要经常被分...
    99+
    2023-06-17
  • php中shuffle是什么意思
    这篇文章主要介绍“php中shuffle是什么意思”,在日常操作中,相信很多人在php中shuffle是什么意思问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php中shuffle是什么意思”的疑惑有所帮助!...
    99+
    2023-06-20
  • php中request是什么意思
    本篇内容介绍了“php中request是什么意思”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!request的中文意思为“请求”,是php中...
    99+
    2023-06-20
  • php中 br 是什么意思
    本文操作环境:Windows7系统,PHP7.1版,Dell G3电脑。php中 br 是什么意思?<br>和<br/>都是html标记语言,用于文本的换行,<br/>是<br>的规范写法,p...
    99+
    2017-08-29
    php br
  • php中null是什么意思
    本教程操作环境:windows10系统、PHP7.1版,DELL G3电脑php中null是什么意思一:null值是什么意思啊在php中NULL是一个特殊标记,NULL值表示一个变量没有值,NULL类型唯一可能的值就是NULL。在下列情况下...
    99+
    2018-02-05
    php
  • php中fgets是什么意思
    本教程操作环境:windows7系统、PHP7.1版、DELL G3电脑PHP fgets是一种基于php语言开发的可以从文件指针中读取一行数据并返回数据的功能函数。fgets()函数用于从打开的文件中一次读取一行数据,该函数的语法格式如下...
    99+
    2022-02-13
    php fgets
  • PHP中construct是什么意思
    本文操作环境:windows7系统、PHP7.1版、DELL G3电脑PHP中construct是什么意思PHP __construct() 函数__construct() 函数创建一个新的 SimpleXMLElement 对象。如果成功...
    99+
    2015-09-07
    PHP construct
  • php中result是什么意思
    本教程操作环境:windows10系统、PHP7.1版,DELL G3电脑php中result是什么意思mysql_result() 函数返回结果集中一个字段的值。如果成功,则该函数返回字段值。如果失败,则返回 false。语法mysql_...
    99+
    2016-04-24
    PHP
  • php中redis是什么意思
    本教程操作环境:windows7系统、PHP7.1版,DELL G3电脑Redis是Remote Dictionary Server(远程数据服务)的缩写,由意大利人Antirez(Salvatore Sanfilippo)开发的一款内存高...
    99+
    2020-11-20
    php redis
  • php中for是什么意思
    本文操作环境:windows7系统、PHP7.1版、DELL G3电脑php中for是什么意思PHP for 循环执行代码块指定的次数。如果您已经提前确定脚本运行的次数,可以使用 for 循环。语法for (init counter; te...
    99+
    2016-05-19
    php for
  • 在php中-= 是什么意思
    本文操作环境:windows7系统、PHP7.4版、DELL G3电脑首先要知道在 PHP 中,基本的赋值运算符是 "="。它意味着左操作数被设置为右侧表达式的值。也就是说,"$x = 5" 的值是 ...
    99+
    2020-09-14
    -= php
  • php中$_FILES是什么意思
    本教程操作环境:windows7系统、PHP7.1版、DELL G3电脑在php中,“$_FILES”是一个预定义的数组变量。预定义变量又叫超全局变量,它们不需要提前声明就可以在所有的作用域中使用。通过这些预定义变量可以获取用户会话、用户操...
    99+
    2015-04-15
    php $_FILES
  • php中flock是什么意思
    在PHP中,flock是一个函数,表示的意思是锁定或者释放文件;该函数的作用是操作文件时锁定文件,只有取消锁定时才可用,如果成功则该函数返回true,如果失败则该函数返回false,语法为“flock(file,lock,block)”。本...
    99+
    2022-07-11
    php
  • php中warning是什么意思
    本教程操作环境:windows7系统、PHP7.1版、DELL G3电脑warning是PHP的一个报错级别,是非致命的,即,发生了该警告之后,其后的脚本仍能正常运行。表示在执行的过程中,PHP发现程序有些不合理的地方,从而提示出警告信息,...
    99+
    2018-11-02
    php warning 报错级别
  • php中mkdir是什么意思
    本教程操作环境:windows7系统、PHP7.1版、DELL G3电脑php中mkdir是什么意思mkdir是PHP中的一个用于创建新目录的内置函数。有时侯我们需要在服务器上创建目录。比如创建以当天日期为名字的目录来备份数据,或者创建以注...
    99+
    2018-03-20
    php mkdir
  • php中session_start()是什么意思
    本教程操作环境:windows7系统、PHP7.1版、DELL G3电脑在php中,session_start()的意思为“开始会话”。语法:session_start(array $options = array()): boolsess...
    99+
    2017-12-16
    php session_start()
  • php中apc是什么意思
    本教程操作环境:windows7系统、PHP7.1版、DELL G3电脑Alternative PHP Cache (APC) 简介Alternative PHP Cache (APC) 中文全称是“可选PHP缓存”,是一种对PHP有效的开...
    99+
    2018-03-25
    php apc
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作