首页 > 语言 > 关键词 > PHP5教程最新资讯 > 正文

浅谈PHP5中垃圾回收算法(Garbage Collection)的演化

2011-02-28 15:11 · 稿源:

前言:PHP是一门托管型语言,在PHP编程中程序员不需要手工处理内存资源的分配与释放(使用C编写PHP或Zend扩展除外),这就意味着PHP本身实现了垃圾回收机制(Garbage Collection)。现在如果去PHP官方网站(php.net)可以看到,目前PHP5的两个分支版本PHP5.2和PHP5.3是分别更新的,这是因为许多项目仍然使用5.2版本的PHP,而5.3版本对5.2并不是完全兼容。PHP5.3在PHP5.2的基础上做了诸多改进,其中垃圾回收算法就属于一个比较大的改变。本文将分别讨论PHP5.2和PHP5.3的垃圾回收机制,并讨论这种演化和改进对于程序员编写PHP的影响以及要注意的问题。

PHP变量及关联内存对象的内部表示

垃圾回收说到底是对变量及其所关联内存对象的操作,所以在讨论PHP的垃圾回收机制之前,先简要介绍PHP中变量及其内存对象的内部表示(其C源代码中的表示)。

PHP官方文档中将PHP中的变量划分为两类:标量类型和复杂类型。标量类型包括布尔型、整型、浮点型和字符串;复杂类型包括数组、对象和资源;还有一个NULL比较特殊,它不划分为任何类型,而是单独成为一类。

所有这些类型,在PHP内部统一用一个叫做zval的结构表示,在PHP源代码中这个结构名称为“_zval_struct”。zval的具体定义在PHP源代码的“Zend/zend.h”文件中,下面是相关代码的摘录。

 

typedef union _zvalue_value {
	long lval;					/* long value */
	double dval;				/* double value */
	struct {
		char *val;
		int len;
	} str;
	HashTable *ht;				/* hash table value */
	zend_object_value obj;
} zvalue_value;

struct _zval_struct {
	/* Variable information */
	zvalue_value value;		/* value */
	zend_uint refcount__gc;
	zend_uchar type;	/* active type */
	zend_uchar is_ref__gc;
};

其中联合体“_zvalue_value”用于表示PHP中所有变量的值,这里之所以使用union,是因为一个zval在一个时刻只能表示一种类型的变量。可以看到_zvalue_value中只有5个字段,但是PHP中算上NULL有8种数据类型,那么PHP内部是如何用5个字段表示8种类型呢?这算是PHP设计比较巧妙的一个地方,它通过复用字段达到了减少字段的目的。例如,在PHP内部布尔型、整型及资源(只要存储资源的标识符即可)都是通过lval字段存储的;dval用于存储浮点型;str存储字符串;ht存储数组(注意PHP中的数组其实是哈希表);而obj存储对象类型;如果所有字段全部置为0或NULL则表示PHP中的NULL,这样就达到了用5个字段存储8种类型的值。

而当前zval中的value(value的类型即是_zvalue_value)到底表示那种类型,则由“_zval_struct”中的type确定。_zval_struct即是zval在C语言中的具体实现,每个zval表示一个变量的内存对象。除了value和type,可以看到_zval_struct中还有两个字段refcount__gc和is_ref__gc,从其后缀就可以断定这两个家伙与垃圾回收有关。没错,PHP的垃圾回收全靠这俩字段了。其中refcount__gc表示当前有几个变量引用此zval,而is_ref__gc表示当前zval是否被按引用引用,这话听起来很拗口,这和PHP中zval的“Write-On-Copy”机制有关,由于这个话题不是本文重点,因此这里不再详述,读者只需记住refcount__gc这个字段的作用即可。

PHP5.2中的垃圾回收算法——Reference Counting

PHP5.2中使用的内存回收算法是大名鼎鼎的Reference Counting,这个算法中文翻译叫做“引用计数”,其思想非常直观和简洁:为每个内存对象分配一个计数器,当一个内存对象建立时计数器初始化为1(因此此时总是有一个变量引用此对象),以后每有一个新变量引用此内存对象,则计数器加1,而每当减少一个引用此内存对象的变量则计数器减1,当垃圾回收机制运作的时候,将所有计数器为0的内存对象销毁并回收其占用的内存。而PHP中内存对象就是zval,而计数器就是refcount__gc。

例如下面一段PHP代码演示了PHP5.2计数器的工作原理(计数器值通过xdebug.org得到):

<?php

$val1 = 100; //zval(val1).refcount_gc = 1;
$val2 = $val1; //zval(val1).refcount_gc = 2,zval(val2).refcount_gc = 2(因为是Write on copy,当前val2与val1共同引用一个zval)
$val2 = 200; //zval(val1).refcount_gc = 1,zval(val2).refcount_gc = 1(此处val2新建了一个zval)
unset($val1); //zval(val1).refcount_gc = 0($val1引用的zval再也不可用,会被GC回收)

?>

Reference Counting简单直观,实现方便,但却存在一个致命的缺陷,就是容易造成内存泄露。很多朋友可能已经意识到了,如果存在循环引用,那么Reference Counting就可能导致内存泄露。例如下面的代码:

<?php

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

?>

这段代码首先建立了数组a,然后让a的第一个元素按引用指向a,这时a的zval的refcount就变为2,然后我们销毁变量a,此时a最初指向的zval的refcount为1,但是我们再也没有办法对其进行操作,因为其形成了一个循环自引用,如下图所示:

其中灰色部分表示已经不复存在。由于a之前指向的zval的refcount为1(被其HashTable的第一个元素引用),这个zval就不会被GC销毁,这部分内存就泄露了。

这里特别要指出的是,PHP是通过符号表(Symbol Table)存储变量符号的,全局有一个符号表,而每个复杂类型如数组或对象有自己的符号表,因此上面代码中,a和a[0]是两个符号,但是a储存在全局符号表中,而a[0]储存在数组本身的符号表中,且这里a和a[0]引用同一个zval(当然符号a后来被销毁了)。希望读者朋友注意分清符号(Symbol)的zval的关系。

在PHP只用于做动态页面脚本时,这种泄露也许不是很要紧,因为动态页面脚本的生命周期很短,PHP会保证当脚本执行完毕后,释放其所有资源。但是PHP发展到目前已经不仅仅用作动态页面脚本这么简单,如果将PHP用在生命周期较长的场景中,例如自动化测试脚本或deamon进程,那么经过多次循环后积累下来的内存泄露可能就会很严重。这并不是我在耸人听闻,我曾经实习过的一个公司就通过PHP写的deamon进程来与数据存储服务器交互。

由于Reference Counting的这个缺陷,PHP5.3改进了垃圾回收算法。

PHP5.3中的垃圾回收算法——Concurrent Cycle Collection in Reference Counted Systems

PHP5.3的垃圾回收算法仍然以引用计数为基础,但是不再是使用简单计数作为回收准则,而是使用了一种同步回收算法,这个算法由IBM的工程师在论文Concurrent Cycle Collection in Reference Counted Systems中提出。

这个算法可谓相当复杂,从论文29页的数量我想大家也能看出来,所以我不打算(也没有能力)完整论述此算法,有兴趣的朋友可以阅读上面的提到的论文(强烈推荐,这篇论文非常精彩)。

我在这里,只能大体描述一下此算法的基本思想。

首先PHP会分配一个固定大小的“根缓冲区”,这个缓冲区用于存放固定数量的zval,这个数量默认是10,000,如果需要修改则需要修改源代码Zend/zend_gc.c中的常量GC_ROOT_BUFFER_MAX_ENTRIES然后重新编译。

由上文我们可以知道,一个zval如果有引用,要么被全局符号表中的符号引用,要么被其它表示复杂类型的zval中的符号引用。因此在zval中存在一些可能根(root)。这里我们暂且不讨论PHP是如何发现这些可能根的,这是个很复杂的问题,总之PHP有办法发现这些可能根zval并将它们投入根缓冲区。

  • 相关推荐
  • 大家在看
  • TikTok新任CEO表示,公司将公开内容审核算法的代码

    前迪士尼高管凯文·梅耶尔(Kevin Mayer)在担任TikTok的CEO之后,发布首份公开声明,该公司将发布驱动其内容审核算法的代码,以便专家可以实时观察其执行情况。

  • Mida Solutions爆出多个漏洞,或殃及微软,思科,惠普,中国电信等40余名企

    Mida Solutions是一家专注于统一通信(UC)的高技能意大利公司。自2004年以来,它提供独特的专业知识以及一整套高级服务和语音应用程序,其使命是为通信提供增值的创新技术。Mida团队已成为统一协作和专业沟通的全球领导者,几乎所有行业的服务提供商,系统集成商。其合作伙伴有微软,思科,惠普,中国电信等40个世界知名企业。Mida eFramework是Mida Solutions公司旗下视频和语音应用程序的完整服务套件,与几乎所有主要的UC平台兼容。

  • 唯样×TE Connectivity超级品牌月火热来袭!

    每一位工程师或者创新企业在研发过程中都经常会产生这样的疑问:如何从概念到产品,实现快速转化?全球领先的连接与传感品牌TE Connectivity正是应对这类挑战的专家,泰科电子提供的解决方案不仅助力于电动汽车、航空航天、数字化工厂和智能家居领域。同时还让建设可持续性的社区、高效的公用事业网络以及超大规模的通信系统变为可能。2020 年 7 月 16 日- 7 月 31 日,唯样商城重磅上线TE Connectivity超级品牌月,以8500+现货库?

  • IBM已与巴西RPA软件供应商WDG Automation达成最终收购协议

    【TechWeb】7月9日消息,据国外媒体报道,当地时间周三,IBM宣布,它已与巴西机器人流程自动化软件供应商WDG Automation达成最终收购协议。外媒报道称,该交易的财务条款并没有披露,预计将于2020年第三季度完成。IBM指出,此次收购将进一步提升其融合AI的自动化综合能力,涵盖从业务流程到IT运营的各个环节。当融合AI的自动化应用于业务流程和IT运营时,它可以帮助缩短识别问题和响应之间的时间。(小狐狸)

  • 首家“快手K-Station欢唱店”落地广州天河 创新玩法引导线下消费

    7 月 10 日,首家“快手K-Station欢唱店”在广州时尚天河惊喜亮相。据了解,该店面坐落于时尚天河中街,整体面积约 200 平米。不同于其他线下KTV品牌,快手K-Station欢唱店首次采用了“互联网+KTV”的新玩法,在装修和设计上也颇具特色。整个空间包含开放式舞台机、K歌房、观众休闲区三大区域,全程自助式消费。走进店内,首先映入眼帘的是一个公共的舞台区,据了解,该舞台机面向所有顾客开放,手机扫码支付即可登台演唱,同时现?

  • ColorOS Smart 5G 技术,让你不再焦虑手机续航

    随着国内 5G 基站建设的稳步推进,5G 信号覆盖范围越来越广。就在 5 月初,国内的运营商们已经将 5G 基站铺到了珠峰,现在即便是海拔 6500 米的珠峰前进营地也能享受到高带宽及低延迟的 5G 网络。但在现实生活中,有很多朋友用着 5G 手机却关闭了手机的 5G 信号,想要以此提高手机的续航水平。其实大可不必如此,以 ColorOS 为例,其推出的 Smart 5G 技术能有效地降低 5G 能耗,延长手机续航,让大家尽情使用 5G 网络。让手机 5G ?

  • AMD推出首款64核PRO工作站 联想ThinkStation P620将搭载

    【TechWeb】7月16日消息,据国外媒体报道,AMD发布了全新锐龙Threadripper PRO系列处理器。该系列处理器支持企业级AMD PRO技术,拥有最高64个核心和超大带宽。AMD据介绍,AMD锐龙Threadripper PRO处理器专为OEM和系统集成商的专业工作站而设计,提供全方位计算能力,可按工作的线程数量以及负荷轻重分别匹配极具优势的核心数量和高主频单核性能。联想全新ThinkStation P620将作为全球首款搭载AMD Threadripper Pro 3995WX处理器的

  • CoinTiger币虎推出IPFS永久云算力抢购,开启全新暴富模式

    IPFS官方消息称, 7 月 20 日将开启大矿工测试奖励计划,测试结束后,Filecoin主网即将上线,币圈将会迎来Filecoin挖矿时代。Filecoin作为IPFS对用户节点贡献度的激励措施,必然要有升值价值才能更能刺激大家做贡献,所以Filecoin网络发行总量 20 亿,其中70%即 14 亿枚用于奖励贡献者,每 6 年减半,相对于IPFS/Filecoin的愿景,币具备稀缺性,可以推升币价高幅上涨。据CoinTiger币虎交易数据显示,Filecoin期货最高价约 54 美元

  • 重新定义专业高性能PC 硬核表现 创造无限 全新联想ThinkStation K新品发布

    7月15日,联想ThinkStation家族新成员——ThinkStation K将在京东平台全新发布。ThinkStation K面向企业用户,以ThinkStation经典之名,将高性能与专业生产力锚定,在行业中诠释专业高性能PC的全新定义,开创ThinkStation全新类别。全新ThinkStation K具备能够支持任意工作的卓越性能,以及可满足关键业务环境需求的强大可靠性。其能够满足平面设计、职业技能教育、游戏设计、数字娱乐传媒等行业的专业用户在大数据处理、广告设计?

  • 解读HPE Discover峰会:数字驱动,开启“洞见力时代”

    新冠疫情发展至今,已在全球感染了1200万人,却丝毫没有减弱的迹象。因此,许多医学专家都劝告大众要“做好长期应对疫情的准备”。由此也引发了各行业对于疫情管控的探讨,特别是对于科学界来说,如何借助科技的力量在与病毒的斗争中占领先机,亦或是通过科技改变我们原有的生活方式,也成为了整个行业关注的焦点。我们可以看到的是,在疫情期间出现了云办公、云会议等新模式,而事实证明这也大大提升企业迈向云计算的步伐,加速了数字化转型

  • 苹果公布最新iPhone拆解机器人Dave:稀土和钨回收神器

    今日,苹果宣布了一项十年计划——承诺到2030年实现供应链和产品100%碳中和。苹果公司计划到2030年,为整个业务、生产供应链和产品生命周期实现碳中和。苹果目前在全球公司运营方面

  • 外媒:苹果今年将在所有5G iPhone机型中使用OLED屏幕

    7月8日消息,据国外媒体报道,苹果今年将在所有5G iPhone机型中使用OLED屏幕。这一消息是基于供应链消息来源,证实苹果将在今年晚些时候发布的iPhone 12上使用OLED面板。外媒报道称,苹果今年计划推出4款iPhone:一款为5.4英寸,两款为6.1英寸,一款为6.7英寸。这四款新iPhone都将配备柔性OLED显示屏,且都将支持5G网络。集邦咨询(TrendForce)资深显示器分析师Eric Chiou表示:“苹果别无选择,只能转向OLED显示屏,

  • Intel官宣Thunderbolt 4接口:Tiger Lake首发、40Gpbs速率

    今年初的CES展会上,Intel宣布了全新一代的Thunderbolt 4接口,首发于10nm+工艺的Tiger Lake处理器。现在Intel正式发布了Thunderbolt 4标准,速率跟Thunderbolt 3一样还是40Gbps,但是规格全面增

  • TikTok将建首个欧洲数据中心 投资额约 5 亿美元

    【TikTok将建首个欧洲数据中心】据BBC 8 月 6 日报道,字节跳动旗下短视频产品TikTok表示,计划在爱尔兰建设首个欧洲数据中心,它将存储欧洲用户在该App上产生的视频、信息和其他数据信息。投资额约 5 亿美元。

  • TikTok粉丝给特朗普竞选App刷差评 TikTok最新消息动态

    【TikTok粉丝给特朗普竞选App刷差评】据媒体报道,近期数千名美国青少年给特朗普 2020 年竞选App刷了大量差评。​据报道,进入美国市场仅两年多,抖音国际版TikTok下载量一路攀升,从与美各大社交巨头的竞争中突出重围,圈了一大波青少年和年轻用户。然而当 7 月初传出特朗普政府要封禁TikTok的消息后,TikTok上的美国年轻人们立刻不干了。

  • TikTok官方发《致TikTok社区的一封信》 疑回应被禁用

    8 月 1 日,关于TikTok被美国禁用的事情传得沸沸扬扬,此前官方并没有对此进行过多回应。不过现在,TikTok官方视频账号发布了一条《给TikTok社区的一封信》,疑似回应了被美国禁止运营的事情。

  • 特朗普将禁止TikTok在美国运营 微软正在谈判收购TikTok美国业务

    【特朗普将禁止TikTok在美国运营】据美国《国会山报》及俄罗斯卫星通讯社报道,特朗普当地时间 7 月 31 日在其专机「空军一号」上对记者表示,他将禁止TikTok在美国运营。

  • 微软正在谈判收购TikTok美国业务 微软、TikTok回应全文说了什么

    【微软正在谈判收购TikTok美国业务】据福克斯商业台官方推特称,微软正在洽谈收购 TikTok 在美国的业务。福克斯商业台的 Charles Gasparino表示,消息来自投行知情人士,尚未收到 TikTok 或微软的评论。

  • 安全与便捷同在,细数 ColorOS 7.2安全能力

    现如今,手机已经从单纯的通讯工具逐渐演化成使用场景更丰富的移动终端。不论是社交、办公、支付还是视频记录生活都可以用手机全搞定。而这也意味着一旦手机丢失,或许里面存储的珍贵照片/视频,重要的文件资料都随之消失。为了让用户更安心的使用手机,ColorOS 推出丰富的安全功能,帮助用户解决这些困扰。 更全面的云服务 相信大家对「云服务」应该不陌生,ColorOS 很早之前就开始为用户提供「云服务」,而在 ColorOS 7. 2 中,

  • 字节跳动倾向于将TikTok分拆独立 TikTok最新消息动态

    【字节跳动倾向于将TikTok分拆独立】据媒体报道,知情人士称,TikTok可以完全独立于字节跳动,以继续在海外运营。但相比出售给微软,字节跳动更倾向于将TikTok分拆独立,届时TikTok这个名字仍将保留,但不再由字节跳动管理。

  • 参与评论
文明上网理性发言,请遵守新闻评论服务协议
  • 热门标签