php引用赋值所造成的内存泄漏

原创 木鱼  2017-08-10 07:30  阅读 75 次

引用赋值

提示: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啊之类的(反正我也知道一点简单的),到时候再回头看这篇文章应该就能理解的更透彻一些。

本文地址:https://www.m5yu.com/php-memory-leak.html
关注我们:请关注一下我们的微信公众号:扫描二维码,公众号:木鱼博客
版权声明:本文为原创文章,版权归 木鱼 所有,欢迎分享本文,转载请保留出处!

发表评论