我有一个使用AWS Dynamo PHP API编写的PHP脚本,它运行一个长循环,在其中从dynamo拉取大量数据,然后处理数据。
当我使用“top”观察进程时,可以看到“php”进程使用的内存使用情况。
在我的脚本循环中,我打印了memory_get_usage(true)的结果。
但在我的测试中,这两个值非常不相似...
它们应该是相似的吗?如果不是,为什么?
在我的测试中,我有一台带有1.7GB RAM的服务器,并将php.ini的memory_limit设置为64M。我还在我的脚本开头调用了gc_enable(),并在每次循环调用之间调用gc_collect_cycles(),希望强制进行垃圾回收。
当我使用“top”观察我的php脚本时,可以看到%MEM不断上升,直到最终超过95%,Linux会杀死php进程,我从“dmesg”中得知。当我查看循环的每次迭代的打印输出时,由memory_get_usage(true)报告的内存使用情况从未超过50MB。
Linux认为脚本使用了近1.7GB内存,而php只认为使用了50MB!
出了什么问题?
即使脚本存在内存泄漏,我也不明白为什么memory_get_usage(true)不计算内存使用情况...
当我使用“top”观察进程时,可以看到“php”进程使用的内存使用情况。
在我的脚本循环中,我打印了memory_get_usage(true)的结果。
但在我的测试中,这两个值非常不相似...
它们应该是相似的吗?如果不是,为什么?
在我的测试中,我有一台带有1.7GB RAM的服务器,并将php.ini的memory_limit设置为64M。我还在我的脚本开头调用了gc_enable(),并在每次循环调用之间调用gc_collect_cycles(),希望强制进行垃圾回收。
当我使用“top”观察我的php脚本时,可以看到%MEM不断上升,直到最终超过95%,Linux会杀死php进程,我从“dmesg”中得知。当我查看循环的每次迭代的打印输出时,由memory_get_usage(true)报告的内存使用情况从未超过50MB。
Linux认为脚本使用了近1.7GB内存,而php只认为使用了50MB!
出了什么问题?
即使脚本存在内存泄漏,我也不明白为什么memory_get_usage(true)不计算内存使用情况...
更新
在花费一些时间注释循环内部运行的各个部分之后,我发现如果删除以下代码:class cMyClass {
public static function static_cmp_fn(&$a, &$b) {
if ($a['att'] == $b['att']) { return 0; }
$ret = ($a['att'] < $b['att']) ? -1 : +1;
return $ret;
}
function DoProcessing(){
$sort_fn = array("cMyClass", "static_cmp_fn");
usort($this->m_dictToSort, $sort_fn);
unset($sort_fn);
}
}
PHP不会占用所有系统内存。看起来usort在泄露内存,我不知道为什么。我不明白的是为什么PHP报告使用内存的信息有误...
有什么想法吗?
memory_get_peak_usage()
的输出。 - meze