Chinaunix

标题: PHP中内存使用讨论欢迎拍砖 [打印本页]

作者: eye_onme    时间: 2008-01-17 09:51
标题: PHP中内存使用讨论欢迎拍砖
最近参加一个交流会

有人讨论到PHP中使用的内存的释放是这么讲的

"使用的变量 不使用时要哟你unset来释放掉来节约内存"

此时有人立即反驳:"unset并不释放内存"

此后无人讨论这个话题

最开始我个人的观点是unset不释放内存 理由很简单 我的测试结果都证明 一个耗费1G内存的脚本 无论如何释放,在top中哦你看到的还是占用1G   难道unset无用?

看这样一个脚步


  1.       1 <?php
  2.       2 echo memory_get_usage()."\n";
  3.       3
  4.       4 $a[]='a';
  5.       5 unset($a);
  6.       6 echo memory_get_usage()."\n";
  7.       7
  8.       8 $x[]='n';
  9.       9 unset($x);
  10.      10 echo memory_get_usage()."\n";
  11.      11
  12.      12 $c[]='a';
  13.      13 unset($c);
  14.      14 echo memory_get_usage()."\n";
  15.      15 ?>
复制代码


结果是这样的
50764          --->Start
51152          --->定义$a并释放
51152          --->定义$x并释放
51152          --->定义$c并释放


PHP是解释执行的过程
定义$a一定导致一次内存分配
定义$x也导致内存分配
但内存使用量没有增加 为什么  因为$a被释放了 $x使用的内存和$a一样 正好使用了$a释放的内存

是不是得出以下结论 :

1    unset释放内存了 释放的内存 还被整个脚本占用 以备复用

2    PHP仅在结束时候将全部内存释放掉 你不是放文件描述 数据库链接 也都会在此刻释放 不会导致资源泄漏

以前我们在C程序里面分配的内存 一定要自己释放否则就会泄漏 PHP中不需要了

[ 本帖最后由 eye_onme 于 2008-1-17 10:09 编辑 ]
作者: dulao5    时间: 2008-01-17 10:10
php5有自己的内存管理机制, 会向操作系统申请大块内存, 并自己管理这块内存. 所以变量释放后只是将内存回收给php了,并没有回收给操作系统.
作者: hshq_cn    时间: 2008-01-17 10:13
unset确实释放了内存,参照php的源代码可以看到;

之所以内存用量没有变化,可能是运行优化的结果,如一次分配脚本所需的内存和复用;

修改上述测试代码,去掉unset一句,可以看到内存用量递增,而且增量“相同”(不严格)。
作者: james.liu    时间: 2008-01-17 10:16
我的code在操作大量数据时,有过溢出,我用unset就牙好身体棒了。。。自此我一直很注意unset。
作者: flynetcn    时间: 2008-01-17 10:33
呵呵,是不是DZ论坛的介绍?
那个人说php是共享内存模式,我的理解是所有变量共享系统为此脚本分配的内存,当已分配内存不够存放新的变量或已有变量占用的空间增多时,php就要占用系统更多的内存了。而unset一个变量只是把此变量注销掉,就像它的字面意思,并不释放此变量占用的内存,也就是把此变量请出了房间,并未把房子扒掉,当新分配变量或原有变量增大时 优先填充空闲房间,当空闲房间不能容下时,php就要新建房间(占用内存增加),只有当一个页面全部执行完后,才开始扒房,而且是一下全部扒掉。

嗨,能看懂相应的C代码就好了。
作者: james.liu    时间: 2008-01-17 10:46
我的猜想:
php对于内存的使用,如同在内存上建立一个tree(是否树俺不知道),建立变量就如同插入节点,节点可能放的只是数据存储地址,如果删除一个变量就要把内存归还给系统的话,意味着重建整个树(保证搜索快捷),所以只是置空节点。

感兴趣的可以直接在php的mail-list提出这个问题看看他们怎么回答。
作者: hshq_cn    时间: 2008-01-17 11:19
unset主要是递减对应的变量结构的引用计数,如果引用为0,就free该结构的内存。
作者: suxiangkun    时间: 2008-01-17 11:35
那想问一下,PHP程序内存不超过多少才能保证性能!(一般的小网站)
作者: crazysoul    时间: 2008-01-21 13:43
根据个人经验,unset前最好加多一步$var = null;,楼主试试




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2