问题描述
我正在编写一个在 Linux 上运行的 C 程序(如果重要的话,使用不到 10 年的内核)。
在该程序中,我想确定某个时刻进程堆的总体大小。
我知道我可以通过阅读 /proc/mypidhere/maps
并解析它来以一种迂回的方式完成此操作 - 但我想更直接地完成此操作,而不会弄乱文件和字符串。
注意事项:
- 我不需要 limit 值,我需要堆的当前大小。
- 我意识到
mmap()
的区域也可以是堆的一部分。我对解决这一事实的答案和忽略它的答案都感兴趣。
解决方法
在带有 glibc
的 Linux 上,您可以使用 malloc_info()
获取堆使用统计信息:
简介
#include <malloc.h>
int malloc_info(int options,FILE *stream);
描述
malloc_info()
函数导出一个 XML 字符串,该字符串描述了
内存分配实现的当前状态
呼叫者。该字符串打印在文件流流上。这
导出的字符串包括有关所有竞技场的信息(请参阅
malloc(3)).
按照目前的实施,选项必须为零。
这会生成一个您必须解析的 XML 文档。但是您也许可以使用 mallinfo()
来获取堆使用统计信息(但请参阅 the BUGS section):
概要
#include <malloc.h>
struct mallinfo mallinfo(void);
描述
mallinfo()
函数返回一个结构的副本,其中包含
malloc(3) 和
相关功能。
请注意,并非所有分配都对 mallinfo() 可见;见BUG 并考虑改用 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) */
};
然而,
BUG
仅返回主内存分配区域的信息。 不包括其他领域的分配。参见 malloc_stats(3) 和 malloc_info(3) 用于包含信息的替代方案 关于其他领域。
mallinfo 结构体的字段类型为 int。然而, 因为某些内部簿记值可能是 long 类型,所以 报告的值可能会环绕零,因此不准确。