引用赋值
提示:php已经不建议使用引用传值了。
文档里面对引用赋值的解释:
引用赋值意味着两个变量指向了同一个数据,没有拷贝任何东西。
任何东西这4个字需要记一下的。
因为以后我可能会发文和大家讨论一下php的COW(写时赋值)机制。
<?php $a = 3; $b = &a;
这就是一个简单的引用赋值(mdzz),下面跟大家讨论一下什么情况会出现内存泄漏。
引用赋值导致内存泄漏
先给大家介绍一个函数,memory_get_usage,返回分配给PHP的内存量,单位是字节数。
本文就用这个函数来计算到底浪费了多少内存。
基本的赋值:
得到的结果显而易见,在释放变量$arr后,php使用的内存前后是一致的,证明变量和变量占用的内存确实销毁了。
引用赋值:
这个是引用赋值,问题很明显啊,243128-242664 = 464, 这之间的内存去哪儿了???
如果你认为这么点内存不够看的话,那么数组在大一点点呢?
248744-244904=3840,中间无故的多占用了这么多内存。究竟是为什么呢?
$arr的结构
图画的丑,不要吐槽。
图上可以看出来,当$arr[] = &$arr的时候,造成了一个结果,循环引用。
$arr[0] = 'xiaoming'; $arr[1] = &$arr; 依此的循环。
当我们此时unset($arr)的时候,php的gc却不能清理掉这个变量的容器(zval)。 因为这块zval的refcount是大于0的,也就是说系统认为这块数据,也就是字符串'xiaoming',还在被某变量使用着, 所以不会对他进行消除,他就一直存在着,直到请求结束。而且,这个zval所占用的内存,是无法被使用的,也就是说这块内存白白浪费了。
这些无用的并且占用着内存而且还释放不掉的zval,导致了内存的泄漏。
哪天有时间了就写写别的php的知识,比如简单的说说zval啊之类的(反正我也知道一点简单的),到时候再回头看这篇文章应该就能理解的更透彻一些。
关注我们:请关注一下我们的微信公众号:扫描二维码

版权声明:本文为原创文章,版权归 木鱼 所有,欢迎分享本文,转载请保留出处!