PHP 的unset()到底会不会释放内存?

1. 如何查看当前内存

使用 memory_get_usage() 函数查看内存

2. 实验

<?php

    function aa()
    {
    
    
        var_dump(memory_get_usage(false));  //int(22356464)
        for ($q=1;$q<1000;$q++){
    
    
            $a[] = $q;
        }
        var_dump(memory_get_usage(false));   //int(22393384)
        array_pop($a);
        var_dump(memory_get_usage(false));   //int(22393408)
        $b = $a;
        var_dump(memory_get_usage(false)); //int(22393408)
        unset($a);
        var_dump(memory_get_usage(false)); //int(22393384)
        unset($b);
        var_dump(memory_get_usage(false)); //int(22356464)
    }
    
    function dd()
    {
    
    
        $this->aa();
        var_dump('last:'.memory_get_usage(false)); // last:22356464
    }

可以看到这个实验是一个方法调用另一个方法来测试变量被unset后内存的变化。

  1. 初始内存值为 22356464
  2. 2创建一个数组$a,填充1000个值,这时内存来到 22393384,内存增长了36860。
  3. 我们去掉数组中的一个值,看下内存:22393408,内存涨了24。
  4. 然后把$a赋值给$b,这时看下内存:22393408,内存没有变化。
  5. unset($a) 后,内存回落到 22393384,减少了24。
  6. 然后又unset($b) ,这是内存回落到初始值 22356464
  7. 返回dd() 函数内,内存还是 初始值 22356464

从这个实验中可以看到,如果$a 有 赋值过给 其他变量以后,当我们unset掉 原来的变量$a,并不会释放掉他原本的内存。 其实在 我们把 $a赋值给$b 的时候就可以发现,内存并没有多加一倍$a 的内存,其实$a 和 $b 都相当于是一个个标签,指向了这堆数据,当我们unset掉$a 其实只是把这个"标签摘掉", 不指向这堆数据了,如果这堆数据没标签标记的话,则会被释放,如果有这样一个$b 也指向这堆数据的话则不会被释放。
所以unset() 是可以释放内存的,前提是这个变量没有赋值给另一个变量

猜你喜欢

转载自blog.csdn.net/qq_39004843/article/details/109627521
今日推荐