Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php内存\u获取\u使用率(真)与最大%MEM_Php_Memory_Memory Management_Memory Leaks - Fatal编程技术网

php内存\u获取\u使用率(真)与最大%MEM

php内存\u获取\u使用率(真)与最大%MEM,php,memory,memory-management,memory-leaks,Php,Memory,Memory Management,Memory Leaks,我有一个用PHP编写的脚本,它使用AWS Dynamo PHP API。它运行一个长循环,从dynamo提取大量数据,然后进行处理 当我使用“top”查看进程时,我可以看到“php”进程使用的内存使用情况 在脚本的循环中,我打印内存使用的结果(true) 当我运行测试时,这两个值甚至一点也不相似 应该是吗?若否,原因为何 在我的测试中,我有一个内存为1.7gb的服务器,我将php.ini的内存限制设置为64M。我还在脚本开始时调用gc_enable(),在每个循环之间调用gc_collect_c

我有一个用PHP编写的脚本,它使用AWS Dynamo PHP API。它运行一个长循环,从dynamo提取大量数据,然后进行处理

当我使用“top”查看进程时,我可以看到“php”进程使用的内存使用情况

在脚本的循环中,我打印内存使用的结果(true)

当我运行测试时,这两个值甚至一点也不相似

应该是吗?若否,原因为何

在我的测试中,我有一个内存为1.7gb的服务器,我将php.ini的内存限制设置为64M。我还在脚本开始时调用gc_enable(),在每个循环之间调用gc_collect_cycles(),希望强制执行垃圾收集

当我使用“top”查看我的php脚本时,我可以看到%MEM不断上升,直到它最终超过95%,linux终止了php进程,我从“dmesg”中了解到这一点。当我查看循环每次迭代的打印输出时,memory_get_usage(true)报告的内存使用量永远不会超过50mb

Linux认为脚本使用了将近1.7gb,php认为它只使用了50mb

发生了什么事

即使脚本有内存泄漏,我也不明白为什么内存使用(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);
    }

}
类cMyClass{
公共静态函数static_cmp_fn(&$a和$b){
if($a['att']==b['att']){返回0;}
$ret=($a['att']<$b['att'])?-1:+1;
返回$ret;
}
函数DoProcessing(){
$sort_fn=数组(“cMyClass”、“static_cmp_fn”);
usort($this->m\u dictToSort,$sort\u fn);
未结算($sort_fn);
}
}
php从不占用所有的系统内存。在我看来,usort正在泄漏内存,我不知道为什么。我不明白的是为什么PHP报告了关于它使用了多少内存的错误信息

有什么想法吗

在花了一些时间注释我在循环中运行的处理的各个部分后,我发现如果我删除以下代码:

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正在泄漏内存,我不知道为什么

显然是的。请参阅手册:

“这里有几个例子提倡使用‘create_function’进行排序,由于usort的局限性,很容易使用这种方法。但是请注意这种方法--在排序例程结束时创建的函数不会被释放,这会造成内存泄漏。因此,可能永远不应该使用这种方法。”

array()
方法似乎做了类似的事情。您可以声明一个从外部调用您的方法的包装器函数,也许

更新

试图构建一个小测试用例,看看会发生什么。到目前为止,我还无法复制泄漏;可能需要更多关于
static\u cmp\u fn()
的功能以及
m\u dictosort
的结构的数据。简单的比较不会引发任何奇怪的事情。在循环中分配字符串、数组或对象也是如此。垃圾收集器会将它们清除,内存保持在低位


我会通过调用另一个根本不排序的函数来进一步限制这个问题,或者进行一个非常基本的排序,以查看问题是否存在于
usort
对其可调用性做了一些有趣的事情,正如我所想的那样(似乎没有,我错了)或者,如果比较函数中发生了一些有趣的事情。

显示
内存\u get\u peak\u usage()
的输出。当我将其添加到日志记录中时,循环的每次迭代大约打印75mb,top报告的php使用了95%的1.7gb系统内存。那么您使用的php版本或扩展就有问题了。PHP永远不会允许用户分配超过内存限制的内存。静态内存中有什么?我对此感到好奇,并尝试在没有任何运气的情况下添加一个unset($sort\u fn)。文档中没有任何内容表明传入一个提供类和静态函数名称的数组与动态相同。使用php的“create_function”动态创建函数与在array()中使用回调函数创建函数不同。我会小心引用没有证据的旧注释。好吧,除了检查PHP代码,我们不知道
usort()
对数组做了什么。但你是对的;我将做一些实验。usort()实现从第635行开始。祝你好运: