首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >memory_peak_get_usage(false)在PHP中真正做了什么?

memory_peak_get_usage(false)在PHP中真正做了什么?
EN

Stack Overflow用户
提问于 2017-05-31 18:20:52
回答 1查看 772关注 0票数 2

我想我已经阅读了stackoverflow.com上关于memory_get_usage()和memory_peak_get_usage()函数的所有主题,但似乎这些解释不适合我的情况。

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

代码语言:javascript
运行
复制
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

日志是通过以下命令生成的,有时通过代码重复:

代码语言:javascript
运行
复制
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(真)?

它与这个线程完全不同:“实际使用”的用法()

EN

回答 1

Stack Overflow用户

发布于 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_usage (false) -返回调用emalloc +头字节+内存对齐所请求的字节之和。它并不完美,因为它没有考虑到由于无法在分配的块的其余部分中容纳空间而浪费的块的数量。
  • memory_get_peak_usage(false) -返回分配给脚本的内存峰值。与上述情况相同,它的结果可能低于实际使用的字节数。
  • memory_get_peak_usage(true) -返回脚本分配的字节的实际峰值。

为什么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冒险好运!

更新

这对我一点帮助都没有,但我确实在以下站点找到了这两个函数的源代码:

下面是:

代码语言:javascript
运行
复制
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;
}

参考资料

使用文件

使用文件

计算内存使用量的完美脚本

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44292102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档