Categories: DevOpsPHP编程

PHP循环引用问题

PHP循环引用,从字面的意思上来看就是自己引用自己,导致内存无法被回收,出现泄露的问题。这个问题在PHP面试的过程中经常会碰到。

一个循环应用的例子:

<?php
$a = array('val');
$a[] =& $a;
xdebug_debug_zval('a');

//输出
a: (refcount=2, is_ref=1)=array (0 => (refcount=2, is_ref=0)='zval', 1 => (refcount=2, is_ref=1)=...)
//unset($a)

从上面可以看出a的应用已经开始循环,此时我们如果使用unset($a), 那么a这个变量就不可达,内存就无法回收,这段代码如果跑上上千万次,内存泄露就很严重了。

如何解决这个问题?

采用同步回收算法,对一个对象进行unset的时候,判断一下其引用计数是否为0,如果为0就直接释放掉,如果不为零,就将其放入一个双向链表中记录下来,等根缓冲区满了时,就会对其进行垃圾回收。

参考资料:

http://blog.100dos.com/2017/04/07/php-garbage-collection-collect-cycles/

5.0
01
开源疫情API接口
2020年5月关系型数据库DB-Engines排行榜
嘻嘻

嘻嘻IT: 笔者是一个工作七八年的程序猿老鸟,从事涉及的技术栈主要包括PHP、Linux、Devops等,喜欢研究新技术,尝试新技术,提升技术自动化和开发效率,致力于write less,do more! 技术每年都会层出不穷,领域划分的越来越细,不可能学习所有的东西,保持对技术的好奇心,理解技术中核心思想,做一个有深度,有思想的开发!

Recent Posts

都说PHP是最差的编程语言,为什么还有这么多公司在使用?

PHP是一门被广大开发者熟知的…

7小时 ago

2024 Google I/O大会放出AI大招 – 招招要友商的”命”

在谷歌年度开发者大会I/O的尾…

1天 ago

PHP Composer如何安装?

PHP Composer是PH…

3天 ago

MacOS上Missing xcrun的问题

在使用MacOS进行编程或开发…

3天 ago