如何获得程序的堆大小

时间:2012-03-17 09:24:16

标签: c++ c linux

如何在linux平台下找到c ++程序的堆内存大小?在使用new或malloc之前我需要堆内存空间,之后还有什么帮助?

#include <malloc.h>
#include <iostream>
int main()
{

     //here need heap memory space
     unsigned char* I2C_Read_Data= new unsigned char[250];
     //get heap memory space After the usage of new 
     return 0;
 }

6 个答案:

答案 0 :(得分:5)

使用valgrind的堆分析器:Massif

答案 1 :(得分:5)

您还可以通过重载newdelete运算符来将堆跟踪添加到您自己的程序中。在我正在研究的a game engine中,我通过特殊函数进行所有内存分配,这些函数将每个分配附加到特定的堆跟踪器对象。这样,在任何给定的时刻,我都可以提取报告,看看实体,演员,Lua脚本等占用了多少内存。

它不像使用外部探查器那样彻底(特别是当外部库处理自己的内存管理时),但是看到你负责的内存是非常好的。

sample of my memory tables

答案 2 :(得分:2)

在Linux上,您可以阅读/proc/[pid]/statm以获取内存使用信息。

  

提供有关内存使用情况的信息,以页为单位。该                 列是:

              size       total program size
                         (same as VmSize in /proc/[pid]/status)
              resident   resident set size
                         (same as VmRSS in /proc/[pid]/status)
              share      shared pages (from shared mappings)
              text       text (code)
              lib        library (unused in Linux 2.6)
              data       data + stack
              dt         dirty pages (unused in Linux 2.6)

有关详细信息,请参阅man page

Adam Zalcman对此question的回答描述了堆分配的一些有趣细节

答案 3 :(得分:1)

您可以使用getrlimit函数调用并为资源传递RLIMIT_DATA。这应该为您提供程序数据段的大小。

答案 4 :(得分:0)

除了外部检查之外,您还可以检测malloc的实现,以便检查这些统计信息。 jemalloctcmalloc是一些实现,除了对多线程代码执行更好的典型libc实现之外,还添加了一些实用功能。

要深入挖掘,您应该了解堆分配的工作原理。最终,OS是为进程分配内存,因为它们要求进程,但是对OS(syscalls)的请求比常规调用慢,因此通常malloc的实现将向OS请求大块(常见的是4KB或8KB块,并对它们进行细分以便为其呼叫者提供服务。

您需要确定您是否对进程消耗的总内存(包括代码本身)感兴趣,进程在特定过程调用期间从OS请求的内存,{{实际使用的内存“ 1}}实现(增加了自己的簿记开销,无论多小)或者请求的内存。

此外,碎片可能会对后两者造成痛苦,并且可能会使真正使用和分配的差异模糊不清。

答案 5 :(得分:0)

你可以尝试&#34; mallinfo&#34;和&#34; malloc_info&#34;。他们可能会工作。当您分配超过2GB时,mallinfo会出现问题。 malloc_info是o / s特定的,非常奇怪。我同意 - 经常在没有第三方工具的情况下做这些事情很好。