php5.2.0内存管理改进
程序员文章站
2022-04-28 14:18:16
php5.2.0的内存管理做了较大的改进,某些情况下内存不能释放的问题不存在了。测试php脚本(mem.php),我用echo n>>和sleep来控...
php5.2.0的内存管理做了较大的改进,某些情况下内存不能释放的问题不存在了。
测试php脚本(mem.php),我用echo n>>和sleep来控制脚本在某个阶段暂停以便检测状态。
<?php
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)。
测试php脚本(mem.php),我用echo n>>和sleep来控制脚本在某个阶段暂停以便检测状态。
复制代码 代码如下:
<?php
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);
}
?>
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)。
上一篇: Java 8 Lambda 表达式
推荐阅读
-
今年最重要更新!微软将对Win10 2004系统管理器大改进
-
操作系统原理之内存管理(第四章第二部分)
-
python内存管理分析
-
简单讲解Objective-C的基本特性及其内存管理方式
-
IOS开发(40)之objective-C 的内存管理之-引用计数
-
netty源码解解析(4.0)-23 ByteBuf内存管理:分配和释放
-
通过任务管理器关闭内存中的可疑程序
-
【原创】(十三)Linux内存管理之vma/malloc/mmap
-
Python深入之python内存管理机制(重点)
-
IOS开发(77)之iOS高级内存管理:比较__unsafe_unretain、__strong、__weak、__autoreleasing