我想我已经阅读了stackoverflow.com上关于memory_get_usage()和memory_peak_get_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>';
信息:对于上一个日志,我将一些变量设置为null,我认为垃圾收集器释放了这些变量,因为内存的使用率从2.53降到了2.40。
我的问题是:这是怎么回事?为什么memory_get_usage()大于memory_get_peak_usage(真)?为什么memory_get_peak_usage(false)大于memory_get_peak_usage(真)?
它与这个线程完全不同:“实际使用”的用法()
发布于 2017-06-01 05:01:51
首先,有这个页面http://jpauli.github.io/2014/07/02/php-memory.html,它详细解释了PHP如何分配内存,以及ZendMM是如何工作的。我强烈建议您检查它,如果您愿意停留在低水平的PHP编程。
现在,转到你的问题,让我告诉你:在互联网上,我没有找到令人满意的答案。话虽如此,以下是基于文件和其他信息来源的公正假设的结果。
正如PHP文档中所述,memory_get_usage (默认为$real_usage为false)返回当前分配给脚本的的内存量。它还只跟踪使用emalloc()分配的内存。
在进一步讨论之前,让我们先给出一些定义:
为什么memory_get_peak_usage(true)?" ()比()大
这很可能是因为他们使用不同的方法来计算内存的使用情况。峰值使用率(true)试图告诉您脚本达到的实际字节数,而get_usage(false)只告诉您所有emalloc调用的总和。它可能会更高,因为它没有编程来实现您的程序当前正在释放内存,也就是说,由于不断地释放和分配,2.5字节的数据实际上可能一直适合于实际内存的2字节。这是基于上文链接的第一页中的评论:
memory_get_usage()给出了一个平均信息,通常是准确的,但不是100%的字节精确。
这意味着它试图通过计算emallocs来告诉您它认为分配多少内存,但是它不知道脚本花费了多少内存块,只要它设置为false。
为什么Memory_get_peak_usage(true)?" (False)比memory_get_peak_usage大
这是它变得奇怪的部分。老实说,我以前从未见过,而且我相信这很可能是个误会。这可能是脚本分配内存的结果(false)实现认为内存仍然分配给该资源,而实际上(true)确保脚本最多使用的是2个字节。
我没有PHP的核心经验,并试图通过谷歌大量搜索来回答这个问题。我希望这能让你对发生的事情有所了解。
无论如何,尽量不要愤怒地敲击键盘,即使这并不是完全合理的。这些方法的"false“实现非常不稳定,不应该用来与它们的"true”实现进行比较。最糟糕的情况是,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;
}
参考资料
使用文件
使用文件
https://stackoverflow.com/questions/44292102
复制相似问题