如何在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;
}
答案 0 :(得分:5)
使用valgrind的堆分析器:Massif
答案 1 :(得分:5)
您还可以通过重载new
和delete
运算符来将堆跟踪添加到您自己的程序中。在我正在研究的a game engine中,我通过特殊函数进行所有内存分配,这些函数将每个分配附加到特定的堆跟踪器对象。这样,在任何给定的时刻,我都可以提取报告,看看实体,演员,Lua脚本等占用了多少内存。
它不像使用外部探查器那样彻底(特别是当外部库处理自己的内存管理时),但是看到你负责的内存是非常好的。
答案 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的实现,以便检查这些统计信息。 jemalloc
和tcmalloc
是一些实现,除了对多线程代码执行更好的典型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特定的,非常奇怪。我同意 - 经常在没有第三方工具的情况下做这些事情很好。