首页 > 解决方案 > 如何从我的程序中获取我的堆的当前大小?

问题描述

我正在编写一个在 Linux 上运行的 C 程序(如果它重要,内核不到 10 年)。

在该程序中,我想在某个时候确定我的进程堆的总体大小。

我知道我可以通过读取/proc/mypidhere/maps和解析来以一种迂回的方式做到这一点——但我想更直接地做到这一点,而且不会弄乱文件和字符串。

笔记:

标签: clinuxmemory-managementdynamic-memory-allocationheap-memory

解决方案


在 Linux 上glibc,您可以使用malloc_info()获取堆使用统计信息:

概要

   #include <malloc.h>

   int malloc_info(int options, FILE *stream);

描述

malloc_info()函数导出一个 XML 字符串,该字符串描述调用者中内存分配实现的当前状态。该字符串打印在文件流流上。导出的字符串包含有关所有 arenas 的信息(请参阅 malloc(3))。

按照目前的实施,选项必须为零。

这会生成一个您必须解析的 XML 文档。但是您也许可以mallinfo()用来获取堆使用统计信息(但请参阅BUGS部分

概要

   #include <malloc.h>

   struct mallinfo mallinfo(void);

描述

mallinfo()函数返回一个结构的副本,其中包含有关 malloc(3) 和相关函数执行的内存分配的信息。

请注意,并非所有分配都对 mallinfo() 可见;请参阅 BUGS 并考虑改用 malloc_info(3)。

返回的结构体定义如下:

       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;   /* See below */
           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) */
       };

然而,

错误

仅返回主内存分配区域的信息。不包括其他领域的分配。请参阅 malloc_stats(3) 和malloc_info(3)以获取包含有关其他领域的信息的替代方案。

mallinfo 结构的字段类型为 int。但是,由于某些内部簿记值可能是 long 类型,因此报告的值可能会环绕零,因此不准确。


推荐阅读