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

php中gc指的是什么

2023-06-29 11:06:33 170人浏览 独家记忆
摘要

本篇内容主要讲解“PHP中GC指的是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php中gc指的是什么”吧!在php中,gc全称“Garbage Collection”,中文意思为“垃圾回

本篇内容主要讲解“PHPGC指的是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习php中gc指的是什么”吧!

在php中,gc全称“Garbage Collection”,中文意思为“垃圾回收”,是一种动态内存管理机制,它会自动释放程序不再需要的已分配的内存块。GC机制可以让程序员不必过分关心程序内存分配,从而将更多的精力投入到业务逻辑。

php中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

最终会变成如下这样:

php中gc指的是什么

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

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

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

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

具体如下如所示:

php中gc指的是什么

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

php中gc指的是什么

即 $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 链表中全部为真正的垃圾,最后将这些垃圾清除。

到此,相信大家对“php中gc指的是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: php中gc指的是什么

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

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

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

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

下载Word文档
猜你喜欢
  • php中gc指的是什么
    本篇内容主要讲解“php中gc指的是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php中gc指的是什么”吧!在php中,gc全称“Garbage Collection”,中文意思为“垃圾回...
    99+
    2023-06-29
  • php中gc是什么意思
    本教程操作环境:windows7系统、PHP7.1版、DELL G3电脑在php中,gc全称“Garbage Collection”,中文意思为“垃圾回收”,是一种动态内存管理机制。垃圾回收机制(GC)会自动释放程序不再需要的已分配的内存块...
    99+
    2020-07-10
    php gc 垃圾回收机制
  • java中的gc是什么
    GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃。Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Jav...
    99+
    2014-09-15
    java入门 gc java
  • java的gc是什么
    一个优秀的Java程序员必须了解GC的工作原理、如何优化GC的性能、如何与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统、实时系统等,只有全面提升内存的管理效率,才能提高整个应用程序的性能。本文将从GC的工作原理、GC的几...
    99+
    2018-07-11
    java入门 java
  • golang中的gc原理是什么
    今天小编给大家分享一下golang中的gc原理是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2022-10-19
  • java gc是什么
    java gc是什么 gc是指垃圾回收机制,当一个对象不能再被后续程序所引用到时,这个对象所占用的内存空间就没有存在的意义了,java虚拟机会不定时的去检测内存中这样的对象,然后回收这块内存空间。gc是Java与C++/C的主要区别之...
    99+
    2021-06-21
    java基础 java gc
  • Golang的GC机制是什么
    这篇文章主要介绍“Golang的GC机制是什么”,在日常操作中,相信很多人在Golang的GC机制是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Golang的GC机制是什么”的疑惑有所帮助!接下来,请跟...
    99+
    2023-07-05
  • Python中GC算法的作用是什么
    Python中GC算法的作用是什么?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。python的五大特点是什么python的五大特点:1.简单易学,开发程序时,专注的是解决问题,...
    99+
    2023-06-14
  • php中$_GET指的是什么
    这篇文章主要介绍“php中$_GET指的是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php中$_GET指的是什么”文章能帮助大家解决问题。在php中,“$_GET”的意思为获取GET数据,它...
    99+
    2023-06-29
  • php中302指的是什么
    这篇“php中302指的是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“php中302指的是什么”文章吧。在php中,3...
    99+
    2023-06-30
  • php中range指的是什么
    这篇文章主要介绍“php中range指的是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php中range指的是什么”文章能帮助大家解决问题。在PHP中,range()函数是创建一个包含指定范围...
    99+
    2023-06-29
  • php中mkdir指的是什么
    这篇文章主要介绍“php中mkdir指的是什么”,在日常操作中,相信很多人在php中mkdir指的是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php中mkdir指的是什么”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-29
  • php中date指的是什么
    这篇文章主要介绍“php中date指的是什么”,在日常操作中,相信很多人在php中date指的是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php中date指的是什么”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-29
  • php中apc指的是什么
    这篇文章主要讲解了“php中apc指的是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php中apc指的是什么”吧!在php中,apc全称“Alternative PHP Cache”,...
    99+
    2023-06-29
  • php中pow指的是什么
    这篇“php中pow指的是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“php中pow指的是什么”文章吧。在php中,p...
    99+
    2023-06-29
  • php中d指的是什么
    这篇“php中d指的是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“php中d指的是什么”文章吧。php d指的是Thi...
    99+
    2023-07-04
  • PHP中Zval指的是什么
    这篇文章给大家分享的是有关PHP中Zval指的是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、概念Zval是zend中另一个非常重要的数据结构,用来标识并实现PHP变量。包含了PHP中的变量值和类型的相关...
    99+
    2023-06-15
  • php中Suhosin指的是什么
    小编给大家分享一下php中Suhosin指的是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、说明Suhosin是一个PHP程序的保护系统。它的设计初衷是为...
    99+
    2023-06-15
  • php中nts指的是什么
    本篇内容介绍了“php中nts指的是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!NTS即None-Thread Safe,一般以fas...
    99+
    2023-06-20
  • php中type指的是什么
    这篇文章主要讲解了“php中type指的是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php中type指的是什么”吧!php中type的意思是数据类型,描述的是一个数据所属的类别。PH...
    99+
    2023-07-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作