0

0

PHP垃圾回收机制

php中文网

php中文网

发布时间:2016-06-06 20:44:10

|

1294人浏览过

|

来源于php中文网

原创

php5.2版本的垃圾回收机制主要针对zval结构中的refcount=0时释放变量,但复合类型的数组或对象,环形引用或者引用自己,都是造成内存泄露,php官网的介绍5.3的gc机制,通过将zval放入root buffer,进行模拟删除(refcount-1),当refcount==0时被认为是垃圾,而回收,下面是4个步骤:
PHP垃圾回收机制

例如:


这样$a数组就有两个元素,一个索引为0,值为字符one,另外一个索引为1,为$a自身的引用,内部存储如下:
a: (refcount=2, is_ref=1)=array (
0 => (refcount=1, is_ref=0)='one',
1 => (refcount=2, is_ref=1)=...
)
“...”表示1指向a自身,是一个环形引用:
PHP垃圾回收机制

按照网上表达所说:先放入root buffer中,refcount-1,这时$a的refcount=1,然后unset一下,refcount=0,则认为$a为垃圾
问题:
1. 我现在假设$a数组中,有2个key引用了自己,比如:


a: (refcount=3, is_ref=1)=array (
0 => (refcount=1, is_ref=0)='one',
1 => (refcount=3, is_ref=1)=...
2 => (refcount=3, is_ref=1)=...
)
那么该数组进行unset后肯定是个垃圾,那么比如我先放到buffer, refcount-1,那么refcount=2,然后再unset-1,refcount=1,这样似乎虽然这个数组删除时会造成垃圾,但根据新的GC的机制说,只有当refcount=0时才会被认为是垃圾,那不是矛盾了吗? 那我数组里面是不是只要>=2的key引用了本身,都不会视为垃圾了?

回复内容:

php5.2版本的垃圾回收机制主要针对zval结构中的refcount=0时释放变量,但复合类型的数组或对象,环形引用或者引用自己,都是造成内存泄露,php官网的介绍5.3的gc机制,通过将zval放入root buffer,进行模拟删除(refcount-1),当refcount==0时被认为是垃圾,而回收,下面是4个步骤:
PHP垃圾回收机制

例如:


这样$a数组就有两个元素,一个索引为0,值为字符one,另外一个索引为1,为$a自身的引用,内部存储如下:
a: (refcount=2, is_ref=1)=array (
0 => (refcount=1, is_ref=0)='one',
1 => (refcount=2, is_ref=1)=...
)
“...”表示1指向a自身,是一个环形引用:
PHP垃圾回收机制

按照网上表达所说:先放入root buffer中,refcount-1,这时$a的refcount=1,然后unset一下,refcount=0,则认为$a为垃圾
问题:
1. 我现在假设$a数组中,有2个key引用了自己,比如:


a: (refcount=3, is_ref=1)=array (
0 => (refcount=1, is_ref=0)='one',
1 => (refcount=3, is_ref=1)=...
2 => (refcount=3, is_ref=1)=...
)
那么该数组进行unset后肯定是个垃圾,那么比如我先放到buffer, refcount-1,那么refcount=2,然后再unset-1,refcount=1,这样似乎虽然这个数组删除时会造成垃圾,但根据新的GC的机制说,只有当refcount=0时才会被认为是垃圾,那不是矛盾了吗? 那我数组里面是不是只要>=2的key引用了本身,都不会视为垃圾了?

找到答案了吗?我尝试回答下

按照楼主说的,看看下面的内容:

名品购物网店系统
名品购物网店系统

适合品牌专卖店专用,从前台的美工设计就开始强调视觉形象,有助于提升商品的档次,打造网店品牌!后台及程序核心比较简洁,着重在线购物,去掉了繁琐的代码及垃圾程式,在结构上更适合一些中高档的时尚品牌商品展示. 率先引入语言包机制,可在1小时内制作出任何语言版本,程序所有应用文字皆引自LANG目录下的语言包文件,独特的套图更换功能,三级物品分类,购物车帖心设计,在国内率先将购物车与商品显示页面完美结合,完

下载

立即学习PHP免费学习笔记(深入)”;

$a = 123;
$b = $a;   //a: (refcount=2, is_ref=0)=123   b: (refcount=2, is_ref=0)=123
unset($b);    //a: (refcount=1, is_ref=0)=123

此时a所指向的zval也会进入垃圾周期,然后对refcount减一,是不是符号a指向的zval也要删除了?显然不是

这里根据我所了解的说说我的看法:GC不会对可能的垃圾根元素进行减一操作,而是会对根元素下面的元素进行减一操作,这样解释才合理。
就说说你这种情况,根节点zval计数不会进行减一操作,循环引用的时候,对循环引用指向的zval计数进行减一,这样不管多少循环引用都可以减到0,这样是不是可以说的通了。

仔细看图你没发现问题么?明明产生了一个自引用,但是为什么refcount还是1呢?应该是变量释放到buffer里面然后refcount--的原因。你就是这块没理解对。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Word 字间距调整方法汇总
Word 字间距调整方法汇总

本专题整合了Word字间距调整方法,阅读下面的文章了解更详细操作。

2

2025.12.24

任务管理器教程
任务管理器教程

本专题整合了任务管理器相关教程,阅读下面的文章了解更多详细操作。

2

2025.12.24

AppleID格式
AppleID格式

本专题整合了AppleID相关内容,阅读专题下面的文章了解更多详细教程。

0

2025.12.24

csgo视频观看入口合集
csgo视频观看入口合集

本专题整合了csgo观看入口合集,阅读下面的文章了知道更多入口地址。

29

2025.12.24

yandex外贸入口合集
yandex外贸入口合集

本专题汇总了yandex外贸入口地址,阅读下面的文章了解更多内容。

58

2025.12.24

添加脚注通用方法
添加脚注通用方法

本专题整合了添加脚注方法合集,阅读专题下面的文章了解更多内容。

1

2025.12.24

重启电脑教程汇总
重启电脑教程汇总

本专题整合了重启电脑操作教程,阅读下面的文章了解更多详细教程。

3

2025.12.24

纸张尺寸汇总
纸张尺寸汇总

本专题整合了纸张尺寸相关内容,阅读专题下面的文章了解更多内容。

5

2025.12.24

Java Spring Boot 微服务实战
Java Spring Boot 微服务实战

本专题深入讲解 Java Spring Boot 在微服务架构中的应用,内容涵盖服务注册与发现、REST API开发、配置中心、负载均衡、熔断与限流、日志与监控。通过实际项目案例(如电商订单系统),帮助开发者掌握 从单体应用迁移到高可用微服务系统的完整流程与实战能力。

1

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 7.7万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 6.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号