搜索

首页  >  问答  >  正文

关于 PHP 内存管理的一个问题

写了个文件测试 PHP 对内存的占用,发现变量是数组和是对象,释放后占用的内存有区别,想问一下是为什么,下面是代码,运行在 PHP 7.0 CLI 模式下。

数组:

<?php
function convert($size){ 
    $unit=array('b','kb','mb','gb','tb','pb'); 
    echo @round($size/pow(1024,($i=floor(log($size,1024)))),2).$unit[$i]."\n"; 
} 
function a(){
    $a = [];
    for($i=0;$i<1000000;$i++){
        $a[$i] = $i;
    }
    convert(memory_get_usage(true));
}
convert(memory_get_usage(true));
// 2M
a();
convert(memory_get_usage(true))
// 2M

输出:

2M
34M
2M

对象:

<?php
function convert($size){ 
    $unit=array('b','kb','mb','gb','tb','pb'); 
    echo @round($size/pow(1024,($i=floor(log($size,1024)))),2).$unit[$i]."\n"; 
} 
function a(){
    $a = new stdClass;
    for($i=0;$i<1000000;$i++){
        $a->$i = $i;
    }
    convert(memory_get_usage(true));
}
convert(memory_get_usage(true));
a();
convert(memory_get_usage(true))

输出:

2M
68M
32M
给我你的怀抱给我你的怀抱2749 天前423

全部回复(2)我来回复

  • 世界只因有你

    世界只因有你2017-05-16 13:13:22

    这个问题很复杂,是关于 PHP 的垃圾回收机制,我也了解的不是很透彻,给你分享一下我了解的部分。
    每个PHP进程会分配一个根缓冲区,执行过程中每次对PHP数据结构体的引用都会被放入这个缓冲区,一旦达到缓冲区的上限(一般为1万),就会触发PHP的垃圾回收机制,清理一些无效的资源。
    如果你把循环的次数改为5000次,就不会触发垃圾回收,后两次的内存值应该是一样的,可以试一下。

    回复
    0
  • 过去多啦不再A梦

    过去多啦不再A梦2017-05-16 13:13:22

    看过一篇文章希望有帮助

    垃圾回收

    回复
    0
  • 取消回复