Chinaunix
标题:
PHP中内存使用讨论欢迎拍砖
[打印本页]
作者:
eye_onme
时间:
2008-01-17 09:51
标题:
PHP中内存使用讨论欢迎拍砖
最近参加一个交流会
有人讨论到PHP中使用的内存的释放是这么讲的
"使用的变量 不使用时要哟你unset来释放掉来节约内存"
此时有人立即反驳:"unset并不释放内存"
此后无人讨论这个话题
最开始我个人的观点是unset不释放内存 理由很简单 我的测试结果都证明 一个耗费1G内存的脚本 无论如何释放,在top中哦你看到的还是占用1G 难道unset无用?
看这样一个脚步
1 <?php
2 echo memory_get_usage()."\n";
3
4 $a[]='a';
5 unset($a);
6 echo memory_get_usage()."\n";
7
8 $x[]='n';
9 unset($x);
10 echo memory_get_usage()."\n";
11
12 $c[]='a';
13 unset($c);
14 echo memory_get_usage()."\n";
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