2012-03-17 63 views
11

如何linux平台下找到一个C++程序的堆内存大小的堆大小?我需要堆内存空间的新的malloc或在使用前,也that.can人后帮助吗?如何让程序

#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; 
} 
+2

new和malloc不使用相同的区域... – UmNyobe 2012-03-17 09:37:35

+2

@UmNyobe:这很奇怪,因为通常'new'调用':: operator new()',而这通常通过'malloc()'来实现。 ... – 2012-03-17 09:45:35

+0

http://stackoverflow.com/questions/1350819/c-free-store-vs-heap – UmNyobe 2012-03-17 09:48:05

回答

2

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

+0

谢谢你的回复,你能给我一个示例代码吗? – Anu 2012-03-17 10:00:42

+0

简单的搜索会产生像这样的链接 - http://www.linuxquestions.org/questions/programming-9/getrlimit-is-setting-soft-and-hard-limits-to-1-why-160165/ – Gangadhar 2012-03-17 10:07:02

+0

嗨, 在这里它显示内存空间,但空间分配后没有改变。 – Anu 2012-03-19 04:03:45

5

使用的valgrind的堆探查:Massif

+1

+1其他人已经为你做了... – UmNyobe 2012-03-17 09:47:01

+0

我正在使用'arm-linux'平台....如何使用valgrind的这个平台?任何想法? – Anu 2012-03-19 06:56:17

4

您也可以通过重载newdelete运营商增加堆跟踪到自己的程序。在a game engine我正在处理,我有所有内存分配通过特殊函数,它将每个分配附加到特定的堆跟踪器对象。这样,在任何特定时刻,我都可以调出报告,查看实体,演员,Lua脚本等占用了多少内存。

它不如使用外部Profiler(特别是在外部库处理他们自己的内存管理),但是确切地看到你要负责的内存是非常好的。

sample of my memory tables

0

除了外部的检查,还可以检测你自己的malloc实现,让你检查这些统计信息。 jemalloctcmalloc是一些实现,除了对多线程代码执行更好的代码(典型的libc实现)之外,它还添加了某种类型的实用程序函数。

为了深入挖掘,你应该学习一些如何堆分配工作。最终,OS是一个分配的内存来处理,因为他们提出要求,但是要求的OS(系统调用)表现一般比普通电话较慢,所以malloc的实施将要求大块的OS(4KB或8KB块是常见的),并细分他们为他们服务的呼叫者。

您需要确定您是否对过程所消耗的总内存(包括代码本身),在特定过程调用中从操作系统请求的进程的内存感兴趣,实际使用的内存由malloc实现(它增加了它自己的记帐开销,无论如何很小),或者请求你的。

此外,破碎可以是用于后两者一痛,并且可以稍微模糊之间真正使用和分配给该差异。

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。亚当Zalcman

回答这个question介绍堆分配的一些有趣的细节

+0

单位是什么?字节?或页面? – weima 2016-09-27 16:10:45

+0

单位是页面。您可以使用getconf PAGE_SIZE来知道页面以字节为单位的大小。 – 2017-05-05 15:06:57

0

你可以试试“mallinfo”和“malloc_info”。他们可能会工作。当您分配2GB以上时,mallinfo存在问题。malloc_info是o/s特定的,特别非常奇怪。我同意 - 通常很高兴在没有第三方工具的情况下执行此操作。