来自`malloc_info`的输出中的字段是什么意思?

时间:2018-01-05 13:59:50

标签: malloc glibc eglibc

我正在调用malloc_info(3)并获取XML输出。

我在网上找到的所有内容都说“这可能会发生变化,我们也不会记录它”。

但对于调查潜在内存碎片问题的人来说,这并不是非常有用。

以下是一些片段:

<malloc version="1">
  <heap nr="0">
    <sizes>
      <size from="257" to="257" total="257" count="1"/>
    </sizes>
    <total type="fast" count="0" size="0"/>
    <total type="rest" count="1" size="257"/>
    <system type="current" size="303104"/>
    <system type="max" size="303104"/>
    <aspace type="total" size="303104"/>
    <aspace type="mprotect" size="303104"/>
  </heap>
  <heap nr="1">
    <sizes>
      <size from="17" to="32" total="96" count="3"/>
      <!-- etc. -->
      <size from="10609" to="10609" total="10609" count="1"/>
      <unsorted from="145" to="209" total="740" count="4"/>
    </sizes>
    <total type="fast" count="95" size="7328"/>
    <total type="rest" count="2633564" size="112589836"/>
    <system type="current" size="2032623616"/>
    <system type="max" size="2032947200"/>
    <aspace type="total" size="19451904"/>
    <aspace type="mprotect" size="19775488"/>
  </heap>

等等,直到...

  <heap nr="27">
    <sizes>
</sizes>
    <total type="fast" count="0" size="0"/>
    <total type="rest" count="0" size="0"/>
    <system type="current" size="32768"/>
    <system type="max" size="32768"/>
    <aspace type="total" size="32768"/>
    <aspace type="mprotect" size="32768"/>
  </heap>
  <total type="fast" count="4232" size="293312"/>
  <total type="rest" count="22498068" size="1597097332"/>
  <system type="current" size="17265770496"/>
  <system type="max" size="17271173120"/>
  <aspace type="total" size="491339776"/>
  <aspace type="mprotect" size="496742400"/>
</malloc>

这一切究竟意味着什么?

我会在答案中加入一些自己的笔记/想法,但是如果有人比我知道的更多,那么我会很感激。

ldd --version报告Ubuntu EGLIBC 2.19-0ubuntu6.13,这是我对glibc版本的最佳猜测。

我用标记了它,因为它取自Ubuntu 14.04,但它也可能与相关。

1 个答案:

答案 0 :(得分:1)

http://core-analyzer.sourceforge.net/index_files/Page335.html处的图表非常有用。

我非常确定的事情:

  • 堆0是主要竞技场。

    • 免费区块保存在&#34;箱子中,按大小排列,以便快速重复使用。
    • 堆0有一个空闲块,大小为257字节。
    • 我不知道currentmaxtotalmprotect之间的关系是什么。
  • 其他堆从1开始编号。

  • 堆1:

    • 一堆各种大小的免费积木。
    • fastrest中的值会跟踪空闲块的总大小:fast.count + rest.count == SUM(size.count)fast.size + rest.size == SUM(size.total)
    • 当前尺寸= 2032623616(~2GiB)
    • 总计(目前使用?)= 19451904(~19MiB)
  • 堆27:

    • 没有免费积木?
    • 32KiB分配,32KiB使用?
  • 总计?

    • ~17.2GiB分配了什么?
    • ~491MiB用过?

最后一个数字看起来不可靠;如果我总计用过的内存(通过其他方式),我得到~3GiB。