php5.2.0内存管理改进


Posted in PHP onJanuary 22, 2007

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 相关文章推荐
十天学会php之第四天
Oct 09 PHP
用PHP读取超大文件的实例代码
Apr 01 PHP
PHP无限分类(树形类)的深入分析
Jun 02 PHP
PHP将XML转数组过程详解
Nov 13 PHP
php中隐形字符65279(utf-8的BOM头)问题
Aug 16 PHP
php生成百度sitemap站点地图类函数实例
Oct 17 PHP
php curl 获取https请求的2种方法
Apr 27 PHP
使用PHP实现下载CSS文件中的图片
Dec 06 PHP
详解PHP的Yii框架中日志的相关配置及使用
Dec 08 PHP
php  单例模式详细介绍及实现源码
Nov 05 PHP
PhpSpreadsheet设置单元格常用操作汇总
Nov 13 PHP
PHP安装扩展mcrypt以及相关依赖项深入讲解
Mar 04 PHP
php中截取字符串支持utf-8
Jan 18 #PHP
php中的登陆login
Jan 18 #PHP
php中的时间显示
Jan 18 #PHP
解决phpmyadmin中文乱码问题。。。
Jan 18 #PHP
php批量删除数据
Jan 18 #PHP
mysql 的 like 问题,超强毕杀记!!!
Jan 18 #PHP
一个更简单的无限级分类菜单代码
Jan 16 #PHP
You might like
一个取得文件扩展名的函数
2006/10/09 PHP
PHP动态输出JavaScript代码实例
2015/02/12 PHP
php 实现301重定向跳转实例代码
2016/07/18 PHP
PHP基于curl后台远程登录正方教务系统的方法
2016/10/14 PHP
js 浏览器事件介绍
2012/03/30 Javascript
js写一个弹出层并锁屏效果实现代码
2012/12/07 Javascript
JSON传递bool类型数据的处理方式介绍
2013/09/18 Javascript
JavaScript charCodeAt方法入门实例(用于取得指定位置字符的Unicode编码)
2014/10/17 Javascript
javascript连续赋值问题
2015/07/08 Javascript
jquery ajax 如何向jsp提交表单数据
2015/08/23 Javascript
JavaScript各类型的关系图解
2015/10/16 Javascript
jQuery ajax请求struts action实现异步刷新
2017/04/19 jQuery
微信小程序封装http访问网络库实例代码
2017/05/24 Javascript
JavaScript利用fetch实现异步请求的方法实例
2017/07/26 Javascript
vue修改vue项目运行端口号的方法
2017/08/04 Javascript
JavaScript定时器设置、使用与倒计时案例详解
2019/07/08 Javascript
微信小程序之左右布局的实现代码
2019/12/13 Javascript
Python实现登录人人网并抓取新鲜事的方法
2015/05/11 Python
python实现一次创建多级目录的方法
2015/05/15 Python
Python:Scrapy框架中Item Pipeline组件使用详解
2017/12/27 Python
解决pyinstaller打包pyqt5的问题
2019/01/08 Python
在django admin中配置搜索域是一个外键时的处理方法
2020/05/20 Python
Pycharm新手使用教程(图文详解)
2020/09/17 Python
CSS3的calc()做响应模式布局的实现方法
2017/09/06 HTML / CSS
C#可否对内存进行直接的操作
2015/02/26 面试题
Java里面Pass by value和Pass by Reference是什么意思
2016/05/02 面试题
机械设计毕业生自荐信
2014/02/02 职场文书
毕业横幅标语
2014/10/08 职场文书
检讨书模板大全
2015/05/07 职场文书
企业工会工作总结2015
2015/05/13 职场文书
七年级作文之游记
2019/12/11 职场文书
python文件名批量重命名脚本实例代码
2021/04/22 Python
如何利用 CSS Overview 面板重构优化你的网站
2021/10/24 HTML / CSS
JavaScript原型链详解
2021/11/07 Javascript
Node.js实现爬取网站图片的示例代码
2022/04/04 NodeJs
js前端图片加载异常兜底方案
2022/06/21 Javascript