这篇文章主要为大家展示了“php如何引用计数实现垃圾回收”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“php如何引用计数实现垃圾回收”这篇文章吧。

创新互联2013年至今,是专业互联网技术服务公司,拥有项目成都网站建设、网站建设网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元西岗做网站,已为上家服务,为西岗各地企业和个人服务,联系电话:18980820575
1、实现说明
给对象添加引用计数器,每次在某个地方引用计数器的值都会增加。每当引用失效时,计数器的值就会减一。
变量value的refcount减一后等于0的话,这个value就会被释放,不是垃圾。垃圾回收器不处理。
变量value的refcount减一后大于0以上的话,这个value被认为不能释放,有可能成为垃圾。
垃圾回收器收集可能的垃圾,达到一定数量后启动垃圾鉴定程序,释放真正的垃圾。
2、实例
';
$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 '------------内存泄漏问题-----------
';
$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清除之前,将耗费不少内存.
// 同样的情况也会发生在对象上,实际上对象更有可能出现这种情况,因为对象总是隐式的被引用。以上是“php如何引用计数实现垃圾回收”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!