在Linux上,我们有这个名为mallinfo的(GNU C库)函数,它给出了一些与内存分配有关的数字:
struct mallinfo {
int arena; /* Non-mmapped space allocated (bytes) */
int ordblks; /* Number of free chunks */
int smblks; /* Number of free fastbin blocks */
int hblks; /* Number of mmapped regions */
int hblkhd; /* Space allocated in mmapped regions (bytes) */
int usmblks; /* Maximum total allocated space (bytes) */
int fsmblks; /* Space in freed fastbin blocks (bytes) */
int uordblks; /* Total allocated space (bytes) */
int fordblks; /* Total free space (bytes) */
int keepcost; /* Top-most, releasable space (bytes) */
};
奇怪的是,这些值通常是32位整数(!);好吧,那真的不行,特别是对于以字节数给出的值(例如fordblks
)。
我猜这是以某种方式被弃用,并且其他一些设施可用于获取相同的信息。什么是替代设施?
使用malloc_info()。你需要解析它的xml输出。 来自malloc_info man page:
malloc_info()函数旨在解决malloc_stats(3)和mallinfo(3)中的缺陷。
malloc_info的源代码是例如可用here。所有变量都使用size_t
存储并相应地打印出来,它应该适用于任何位机器。
例如。在我的系统上(glibc版本2.26)malloc_info(0, stdout)
打印出以下内容:
<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"/>
<total type="mmap" 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>