c - 如何从我的程序中获取我的堆的当前大小?
问题描述
我正在编写一个在 Linux 上运行的 C 程序(如果它重要,内核不到 10 年)。
在该程序中,我想在某个时候确定我的进程堆的总体大小。
我知道我可以通过读取/proc/mypidhere/maps
和解析来以一种迂回的方式做到这一点——但我想更直接地做到这一点,而且不会弄乱文件和字符串。
笔记:
- 我不需要限制值,我需要堆的当前大小。
- 我意识到
mmap()
'ed 区域也可以是堆的一部分。我对解决这个事实的答案和忽略它的答案都感兴趣。
解决方案
在 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 类型,因此报告的值可能会环绕零,因此不准确。
推荐阅读
- java - 在投注网站上提取球队只给了我 13 支球队的限制
- django - /customer/1/list/ 处的 NoReverseMatch
- spring - thymeleaf - 选定选项的通行证 ID
- java-8 - 将不同结果类型的多个“Try”实例组合为应用程序
- python - Python 中的 OOP。我如何做类方法?
- ansible - 如何从 Ansible 的输出中查找缺失的数字
- python - 基于二元异或运算的Tensorflow成本函数
- ionic-framework - Stenciljs - 背景图片 css 路径
- c# - 如何在 C# Discord.net 中读取发布的文件?
- java - getAttribute 或 getText