malloc_info()如何工作?

rad*_*man 7 c c++ gcc gnu

我一直试图弄清楚malloc.h中的malloc_info()函数是如何工作的.我知道你必须传递一个FILE*并且还没有实现任何选项,但我对它实际报告的内容感到茫然!?此外,我编写了一个测试应用程序,分配了一大堆内存,并且malloc_info()报告的值不会改变,除非我做了20,000个1字节分配?

有没有人对malloc_info()有任何经验,并且可以了解它应该测量的内存的哪些方面?

应该注意的是,我可以在谷歌上找到关于malloc_info()的一切,只是一些粗略的错误报告.

malloc_info()的示例输出:

<malloc version="1">
    <heap nr="0">
        <sizes>
        </sizes>
        <total type="fast" count="0" size="0"/>
        <total type="rest" count="0" size="0"/>
        <system type="current" size="135168"/>
        <system type="max" size="135168"/>
        <aspace type="total" size="135168"/>
        <aspace type="mprotect" size="135168"/>
    </heap>
    <total type="fast" count="0" size="0"/>
    <total type="rest" count="0" size="0"/>
    <system type="current" size="135168"/>
    <system type="max" size="135168"/>
    <aspace type="total" size="135168"/>
    <aspace type="mprotect" size="135168"/>
</malloc>
Run Code Online (Sandbox Code Playgroud)

编辑:

作为进一步的解释; 我的后备位置是mallinfo()函数,但是我希望使用malloc_info()作为我可以收集的内容,它的目标是替换mallinfo().我发现mallinfo()和malloc_info()的工作方式不同.在我的测试中,mallinfo()跟踪我的所有分配,而malloc_info()完全没有这样做.我只能假设malloc_info()当前已被破坏,或者它的目的不同于mallinfo().

在omnifarious给出的文章中,有很好的理由应该弃用mallinfo():

它完全不适合64位机器.SysV规范要求的数据类型不允许大于2 ^ 31字节的值(结构中的所有字段都是整数).第二个问题是数据结构确实特定于当时使用的malloc实现SysV.

但是我认为目前malloc_info()还没有准备好接受它的位置.

进一步编辑:经过多一点挖掘后,似乎malloc_info()在所有出现135168的地方报告了mallinfo()的竞技场大小(至少这是它所对应的).这似乎没那么有用,与mallinfo()允许的相比,它是一个非常一维的信息.

Omn*_*ous 1

大型分配通常只需告诉操作系统“我需要 x 数量的内存页”即可处理,通常是通过mmaping /dev/zero。大于一个页面或 4 个页面(一个页面通常为 4096 字节)的分配通常以这种方式处理,并且这些分配不是我期望 malloc 诊断跟踪的内容。

不幸的是,我对 malloc_info 的了解并不比其他人多。LJ发表的有关删除 mallinfo(以及其他内容)的文章,由我们不可估量的 glibc 作者 Ulrich Drepper 撰写,似乎是现有的最好信息,而且内容非常薄弱,无论如何您都可能通过 Google 找到这些信息。

我在paste.lisp.org 粘贴的程序应该按其malloc速度运行并打印出堆信息。这是非常针对 Linux 和 gcc 的,但是,当然,这个问题也是如此。也许摆弄测试程序的输出会让您对它所讨论的内容有所了解。