Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.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中,内存使用率(false)到底做了什么?_Php_Memory_Memory Management - Fatal编程技术网

在PHP中,内存使用率(false)到底做了什么?

在PHP中,内存使用率(false)到底做了什么?,php,memory,memory-management,Php,Memory,Memory Management,我想我已经阅读了stackoverflow.com上关于memory\u get\u usage()和memory\u peak\u get\u usage()函数的所有主题,但是这些解释似乎不适合我的情况 我的脚本显示了以下结果: memory peak usage (true): 2 memory peak usage (false): 0.44921112060547 memory get usage: 0.40422821044922 memory peak usage (true):

我想我已经阅读了stackoverflow.com上关于memory\u get\u usage()和memory\u peak\u get\u usage()函数的所有主题,但是这些解释似乎不适合我的情况

我的脚本显示了以下结果:

memory peak usage (true): 2
memory peak usage (false): 0.44921112060547
memory get usage: 0.40422821044922

memory peak usage (true): 2
memory peak usage (false): 6.5214996337891
memory get usage: 1.2414016723633

memory peak usage (true): 2
memory peak usage (false): 6.5214996337891
memory get usage: 1.2413940429688

memory peak usage (true): 2
memory peak usage (false): 6.5214996337891
memory get usage: 1.2425689697266

memory peak usage (true): 2
memory peak usage (false): 6.5214996337891
memory get usage: 1.2467498779297

memory peak usage (true): 2
memory peak usage (false): 18.253067016602
memory get usage: 2.5322036743164

memory peak usage (true): 2
memory peak usage (false): 18.253067016602
memory get usage: 2.5322113037109

memory peak usage (true): 2
memory peak usage (false): 18.253067016602
memory get usage: 2.406005859375
日志由以下命令生成,有时通过代码重复:

echo 'memory peak usage (true): '.(memory_get_peak_usage(true)/1024/1024).'<br>';
echo 'memory peak usage (false): '.(memory_get_peak_usage(false)/1024/1024).'<br>';
echo 'memory get usage: '.(memory_get_usage()/1024/1024).'<br><br>';
echo“内存峰值使用率(true):”(内存峰值使用率(true)/1024/1024)。
; 回显“内存峰值使用率(错误):”(内存峰值使用率(错误)/1024/1024)。
; 回显“内存获取用法:”。(内存获取用法()/1024/1024)。“

”;
信息:对于上一个日志,我已经将一些变量设置为null,我认为它们被垃圾收集器释放了,因为内存使用率从2.53降低到了2.40

我的问题是: 发生了什么?为什么memory\u get\u usage()大于memory\u get\u peak\u usage(true)?为什么内存的峰值使用率(false)大于内存的峰值使用率(true)

它与此线程完全不同:

首先,本页详细解释了PHP如何分配内存,以及ZendMM是如何工作的。如果您愿意深入研究低级PHP编程,我强烈建议您查看它

现在,继续你的问题,让我告诉你:在互联网上,我没有找到一个令人满意的答案。尽管如此,以下内容是基于文件和其他信息来源的公平假设的结果


如PHP文档中所述,memory\u get\u usage(默认$real\u usage为false)返回当前分配给脚本的内存量。它还只跟踪使用emalloc()分配的内存

在进一步讨论之前,让我们先给出一些定义:

  • memory\u get\u usage(false)-返回调用emalloc+头字节+内存对齐所请求的字节总数。它并不完美,因为它没有考虑到由于无法在分配的块的剩余段中容纳空间而浪费的块的数量

  • memory\u get\u peak\u usage(false)-返回已分配给脚本的内存峰值。与上面的情况相同,它可能给出的结果低于实际使用的字节数

  • memory\u get\u peak\u usage(true)-返回脚本分配的实际字节峰值


为什么内存使用率()大于内存峰值使用率(true)?

这很可能是因为他们使用不同的方法计算内存使用量。 -峰值使用率(true)试图告诉您脚本达到的实际字节数,而get_使用率(false)只告诉您所有emalloc调用的总和。它可能更高,因为它没有被编程来实现您的程序当前正在释放内存,并且由于不断地释放和分配,2.5字节的数据实际上可能在整个时间内都适合您实际内存的2字节。 这是基于我在上面链接的页面上的评论:

memory_get_usage()提供平均信息,通常是准确的,但以字节为单位不是100%准确

也就是说,它试图通过计算emallocs来告诉您它相信的平均分配量,但只要设置为false,它就无法知道脚本花费了多少内存块

为什么内存\u获取\u峰值\u使用率(false)大于内存\u获取\u峰值\u使用率(true)?“

这里是它变得奇怪的部分。老实说,我以前从未见过这种情况,而且我相信这很可能是一种误解。这可能是由于您的脚本以(错误)实现认为内存仍然分配给该资源的方式分配内存,而事实上,(正确)确保您的脚本最多使用2个字节

我没有PHP的核心经验,并试图通过谷歌搜索来回答这个问题。我希望它能让你对正在发生的事情有所了解

在任何情况下,尽量不要愤怒地敲击键盘,即使它没有完美的意义。这些方法的“错误”实现非常不稳定,不应该用来与“正确”的实现进行比较。最坏的情况是,PHP的实现很差

祝你的PHP之旅好运

更新

这对我没有任何帮助,但我确实在以下位置找到了这两个函数的源代码:

下面是:

ZEND_API size_t zend_memory_usage(int real_usage)
{
#if ZEND_MM_STAT
    if (real_usage) {
        return AG(mm_heap)->real_size;
    } else {
        size_t usage = AG(mm_heap)->size;
        return usage;
    }
#endif
    return 0;
}

ZEND_API size_t zend_memory_peak_usage(int real_usage)
{
#if ZEND_MM_STAT
    if (real_usage) {
        return AG(mm_heap)->real_peak;
    } else {
        return AG(mm_heap)->peak;
    }
#endif
    return 0;
}
参考资料