微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从我的程序中获取我的堆的当前大小?

如何解决如何从我的程序中获取我的堆的当前大小?

我正在编写一个在 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 类型,所以 报告的值可能会环绕零,因此不准确。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。