如何获得一个程序的堆大小

在linux平台下如何find一个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; } 

Solutions Collecting From Web of "如何获得一个程序的堆大小"

使用valgrind的堆分析器: Massif

您也可以通过重载newdelete操作符来将堆跟踪添加到您自己的程序中。 在我正在开发的游戏引擎中 ,我将所有的内存分配都通过特殊的函数,这些函数将每个分配附加到特定的堆跟踪器对象。 这样,在任何时候,我都可以提出报告,看看有多少内存被实体,演员,Lua脚本等占用。

它不像使用外部剖析器那么彻底(特别是当外部库处理自己的内存管理时),但是确切地看到你要负责的内存是非常好的。

我的记忆表的样本

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

在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) 

有关更多详细信息,请参阅手册页 。

Adam Zalcman回答这个问题描述了堆分配的一些有趣的细节

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

深入挖掘,你应该多学习一下堆分配是如何工作的。 最终,操作系统是分配内存的进程,但是对操作系统(系统调用)的请求比常规调用要慢,所以一般来说, malloc的实现会向操作系统请求大块(4KB或8KB块是常见的),并细分他们为他们的呼叫者。

您需要确定是否对流程(包括代码本身)消耗的内存总量,特定过程调用中从操作系统请求的内存, malloc实现实际使用的malloc自己的账簿开销,无论小)还是要求的记忆。

而且,碎片化对于后两者来说可能是一种痛苦,并且可能会模糊真正使用和分配之间的差异。

你可以尝试“mallinfo”和“malloc_info”。 他们可能会工作。 当您分配2GB以上时,mallinfo有问题。 malloc_info是具体的,特别是很奇怪。 我同意 – 通常不用第三方工具就可以做这个东西。