php5.2.0 的内存管理做了较大的改进, 某些情况下内存不能释放的问题不存在了
测试 php 脚本 (mem.php), 我用 echo N>> 和 sleep 来控制脚本在某个阶段暂停以便检测状态
代码如下:
- echo '1>>';
- sleep(5);
- $o = array();
- for ($i=0;$i<=100000;$i++) {
- $o[]='aaaaaaaaaaaaaaaaaaaaa';
- }
- echo '2>>';
- sleep(5);
- unset($o);
- echo '3>>';
- while (true) {
- echo '..';
- sleep(10);
- }
- ?>
监测内存使用情况的 bash script(注意: 里面的 mem 是取自上面的 php 脚本名):
while true;do clear;ps au|grep -v "\(vi\|grep\)"|grep "\(mem\|RSS\)";sleep 2;done;
以下是 $/usr/local/bin/php mem.php 这个进程在三种状态 (数组创建前, 数组创建后, 数组销毁后) 下, 用 5.1.6 和 5.2.0 的 PHP(我使用了一样的 configure 参数)测试的 RSS(内存使用值, 单位 KB)结果
- php5.1.6:
- 3164
- 18076
- 17572
- PHP5.2.0:
- 4088
- 14400
- 4424
大家可以看到 5.1.6 这个版本, unset 数组之后, 内存并没有从进程里释放出来, 虽然它是可以继续被这个 php 进程再利用, 但是却无法被系统的其他进程所使用而 5.2.0 则真正释放出了内存
大家可能还注意到, 在最开始, 5.2.0 的内存使用比 5.1.6 多了几个 kb, 这是由于 5.2.0 增加了一些新的东西, 这个是很正常的
另外 php5.2.0 的内存分配也进行了大的改进, 官方的说法是对 memory_limit 的检测由每次呼叫 emalloc()的时候进行改为直接检测从系统请求的内存数据块 (blocks) 需要更进一步了解的朋友可以自己去研究代码而由于内存分配的实现的更改, 内存控制可以更精确地被控制在 memory_limit 之下, 也就是说以前 php 代码里, 如果有超过了 memory_limit 的内存使用而没有出错的, 在 php5.2.0 里可能会报错为了平衡这次改进, PHP5.2.0 的默认的 memory_limit 由以前的 8MB 改为了 16MB. 搜索源代码可以看到这个修改(find . -name \*c -type f |xargs cat |grep memory_limit)
来源: https://www.php1.cn/detail/php-81fe7100bb.html