PHP引用计数实现垃圾回收的具体操作是什么
Admin 2022-09-26 群英技术资讯 295 次浏览
实现说明
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 中 FTP 相关函数,讲解 php 如何操作 ftp 的连接、传输及文件与目录的相关操作的技巧。
Opcache 的前生是 Optimizer+ ,它是 Zend 开发的 PHP 优化加速组件。Optimizer+ 将 PHP 代码预编译生成的脚本文件 Opcode 缓存在共享内存中供以后反复使用,从而避免了从磁盘读取代码再次编译的时间消耗。同时,它还应用了一些代码优化模式,使得代码执行更快。从而加速 PHP 的执行。
在thinkphp中,fetch方法用于渲染模板文件输出,该方法不会直接渲染输出,而是支持模板或者内容的标签解析,返回解析后的内容,渲染输出系统也会自动调用send方法进行渲染输出,语法为“$this->fetch(模板名称);”。
我们知道laravel框架是PHP中常用的用框架之一,很多新手在学习laravel框架时,对于中间件的作用以及使用不是很了解,对此,这篇文章就给大家分享一下,感兴趣的朋友就继续往下看吧。
方法:1、在middleware的“verifyCsrfTkoen.php”中添加handle函数方法,在整个项目禁用token;2、用“protected $except=['屏蔽不提交token的路由']”在屏蔽掉部分路由禁用即可。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008