PHP引用计数实现垃圾回收的具体操作是什么
Admin 2022-09-26 群英技术资讯 853 次浏览
关于“PHP引用计数实现垃圾回收的具体操作是什么”的知识有一些人不是很理解,对此小编给大家总结了相关内容,具有一定的参考借鉴价值,而且易于学习与理解,希望能对大家有所帮助,有这个方面学习需要的朋友就继续往下看吧。实现说明
1、给对象添加引用计数器,每次在某个地方引用计数器的值都会增加。每当引用失效时,计数器的值就会减一。
变量value的refcount减一后等于0的话,这个value就会被释放,不是垃圾。垃圾回收器不处理。
变量value的refcount减一后大于0以上的话,这个value被认为不能释放,有可能成为垃圾。
2、垃圾回收器收集可能的垃圾,达到一定数量后启动垃圾鉴定程序,释放真正的垃圾。
实例
<?php
// PHP垃圾回收机制案例: 参考php手册
// --------------------标量类型--------------------
// tip:每个php变量存在一个叫"zval"的变量容器中,该容器中包含变量的类型和值,"is_ref":是否是引用变量,"refcount":引用计数
// ex:生成一个新的 zval容器
$a = 'new string';
// ex:显示 zval容器 信息
xdebug_debug_zval('a'); // a:(refcount=1, is_ref=0),string 'new string' (length=10)
// ex:增加 zval容器的引用计数
$c = $b = $a;
xdebug_debug_zval('a'); // a:(refcount=3, is_ref=0),string 'new string' (length=10)
xdebug_debug_zval('b'); // b:(refcount=3, is_ref=0),string 'new string' (length=10)
xdebug_debug_zval('c'); // c:(refcount=3, is_ref=0),string 'new string' (length=10)
// tip:此时只有一个容器, 因为当没必要时,php不会去复制已生成的变量容器
// 此时这个变量容器被变量 a ,变量 b和变量c关联.
unset($b); // ex:减少引用计数
xdebug_debug_zval('a'); // a:(refcount=2, is_ref=0),string 'new string' (length=10)
// tip:unset 删除变量时,refcount 变量计数减一,此时只有$a,$b 指向该变量容器
unset($a);
unset($c);
var_dump($a);
// tip:此时 recount为 0,变量被删除
// 当recount 变为 0 时,包含类型和值的这个变量容器就会从内存中删除。
// --------------------复合类型--------------
echo '--------------复合类型------------<br/>';
$a = array(
'name' => 'junior',
'age' => 18
);
xdebug_debug_zval('a');
// a:(refcount=1, is_ref=0),
// array (size=2)
// 'name' => (refcount=1, is_ref=0),string 'junior' (length=6)
// 'age' => (refcount=1, is_ref=0),int 18
// ex:添加一个已经存在的元素到数组中
$a['love'] = $a['name'];
xdebug_debug_zval('a');
// a:(refcount=1, is_ref=0),
// array (size=3)
// 'name' => (refcount=2, is_ref=0),string 'junior' (length=6)
// 'age' => (refcount=1, is_ref=0),int 18
// 'love' => (refcount=2, is_ref=0),string 'junior' (length=6)
// $a = array('one');
// xdebug_debug_zval('a');
// // $b = &$a;
// $c = $a;
// $b = &$c;
// xdebug_debug_zval('b');
// xdebug_debug_zval('c');
// xdebug_debug_zval('a');
// 清理变量容器问题
echo '------------内存泄漏问题-----------<br/>';
$a = array('one');
xdebug_debug_zval('a');
// a:(refcount=1, is_ref=0),
// array (size=1)
// 0 => (refcount=1, is_ref=0),string 'one' (length=3)
$a[] = &$a;
xdebug_debug_zval('a');
// a:(refcount=2, is_ref=1),
// array (size=2)
// 0 => (refcount=1, is_ref=0),string 'one' (length=3)
// 1 => (refcount=2, is_ref=1),
// &array
// unset($a);
// (refcount=1, is_ref=1)=array (
// 0 => (refcount=1, is_ref=0)='one',
// 1 => (refcount=1, is_ref=1)=...
// )
// tip: unset($a) 后引用计数减一,尽管不再有某个作用域中的任何符号指向这个结构(就是变量容器),
// 由于数组元素"1"仍然指向数组本身,所以这个容器不能被清除
// 因为没有另外的符号指向它,用户没有办法清除这个结构,结果就会导致内存泄漏
// 庆幸的是, php将在脚本执行结束时清除这个数据结构, 但是在php清除之前,将耗费不少内存.
// 同样的情况也会发生在对象上,实际上对象更有可能出现这种情况,因为对象总是隐式的被引用。
推荐操作系统:windows7系统、PHP5.6、DELL G3电脑
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
本篇文章给大家带来了关于PHP的相关知识,给定a,b两个文件, 分别有x,y行数据, 其中(x, y均大于10亿), 机器内存限制100M,该如何找出其中相同的记录?本文就来为大家讲解一下实现方法,希望对大家有帮助。
我们做网页的时候,常常会需要使用到分页,这篇文章主要给大家分享CI框架分页类的用法,下文代码具有一定的借鉴价值,感兴趣的朋友可以参考一下,下面我们就一起来看看吧。
laravel路由文件在“routes”目录里。Laravel中所有的路由文件定义在routes目录下,它里面的内容会自动被框架加载;该目录下默认有四个路由文件用于给不同的入口使用:web.php、api.php、console.php等。
今天小编就为大家分享一篇layui数据表格自定义每页条数limit设置,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
这篇文章主要介绍了PHP封装的简单连接MongoDB类,涉及php针对MongoDB数据库的简单连接、数据插入、查询等相关操作技巧,需要的朋友可以参考下
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008