【问题标题】:How do I obtain the current size of my heap from within my program?如何从我的程序中获取我的堆的当前大小?
【发布时间】:2021-05-09 17:40:46
【问题描述】:

我正在编写一个在 Linux 上运行的 C 程序(使用不到 10 年的内核以防万一)。

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

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

注意事项:

  • 我不需要 limit 值,我需要堆的当前大小。
  • 我意识到mmap()'ed 区域也可以是堆的一部分。我对解决这一事实的答案和忽略它的答案都感兴趣。

【问题讨论】:

  • 我知道我可以通过读取 /proc/mypidhere/maps 并解析它以一种迂回的方式做到这一点并非如此 - Linux 上的glibc 使用mmap()brk(),并没有真正的方法来区分 mmap()'d 匿名页面的来源和地址空间映射。
  • 通常不受限制,与虚拟地址空间一样大。你只能试试看 malloc 什么时候会失败。
  • 这有帮助吗? linux.die.net/man/2/getrlimit
  • @AndrewHenle:见编辑。
  • @0___________:我没有问限制,我问的是当前大小。

标签: c linux memory-management dynamic-memory-allocation heap-memory


【解决方案1】:

在带有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() 可见;见错误 并考虑改用 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 类型,所以 报告的值可能会环绕零,因此不准确。

【讨论】:

  • 1.什么是“其他领域”? 2、mallinfo::arenamallinfo::hblkhd要加起来吗?还是使用mallinfo::uordblks? 3. 如果值是字节,为什么字段名称会提到块? 4. 如果分配了超过 2^31-1 个字节怎么办?
  • @einpoklum 我没有足够的经验来了解这些数字的实际含义——当我进入堆管理时,它是用于调试目的,而 Valgrind 或类似的工具是更好的工具为了那个原因。此链接描述了内部 glibc 堆实现比我能做到的要好得多:sourceware.org/glibc/wiki/MallocInternals
猜你喜欢
  • 2017-04-26
  • 2017-06-03
  • 1970-01-01
  • 2010-09-11
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
  • 1970-01-01
相关资源
最近更新 更多