2012-03-17 27 views
11

Come trovare le dimensioni della memoria heap di un programma C++ sotto la piattaforma linux? Ho bisogno di spazio di memoria heap prima dell'uso di new o malloc e anche dopo.può aiutare qualcuno?come ottenere la dimensione dell'heap di un programma

#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

nuovo e malloc non usano la stessa regione ... – UmNyobe

+2

@UmNyobe: Questo è strano, dato che in genere 'new' chiama' :: operator new() ', che a sua volta viene solitamente implementato tramite' malloc() ' ... –

+0

http://stackoverflow.com/questions/1350819/c-free-store-vs-heap – UmNyobe

risposta

2

È possibile utilizzare la funzione di chiamata getrlimit e passare il RLIMIT_DATA per la risorsa. Questo dovrebbe darti la dimensione del segmento dati per il tuo programma.

+0

Grazie per la risposta, puoi darmi un codice di esempio? – Anu

+0

Una ricerca semplice avrebbe prodotto link come questo - http://www.linuxquestions.org/questions/programming-9/getrlimit-is-setting-soft-and-hard-limits-to-1-why-160165/ – Gangadhar

+0

Ciao, In questo mostra lo spazio di memoria, ma non viene modificato dopo che lo spazio è stato allocato. – Anu

5

Usa di valgrind mucchio profiler: Massif

+1

+1 altre persone lo hanno già fatto per voi ... – UmNyobe

+0

Sto usando la piattaforma 'arm-linux' .... Come valgrind può essere usato con questa piattaforma? Qualche idea? – Anu

4

È inoltre possibile aggiungere il monitoraggio mucchio per i propri programmi da sovraccarico degli operatori new e delete. In a game engine sto lavorando, ho tutta l'allocazione di memoria che passa attraverso funzioni speciali, che collegano ogni allocazione ad un particolare oggetto tracker dell'heap. In questo modo, in qualsiasi momento, posso aprire un rapporto e vedere quanta memoria viene occupata da entità, attori, script Lua, ecc.

Non è così approfondito come utilizzare un profiler esterno (in particolare quando all'esterno le librerie gestiscono la propria gestione della memoria), ma è molto bello per vedere esattamente di quale memoria si è responsabili.

sample of my memory tables

0

Oltre a ispezione esterna, è anche possibile strumento l'implementazione di malloc per farvi ispezionano le statistiche. jemalloc e tcmalloc sono implementazioni che, oltre a funzionare meglio per il codice multithreading che le tipiche implementazioni di libc, aggiungono alcune funzioni di utilità di quel tipo.

Per approfondire, è necessario imparare un po 'di più su come funziona l'allocazione dell'heap. In definitiva, il sistema operativo è quello che assegna la memoria ai processi mentre lo chiedono, tuttavia le richieste al sistema operativo (syscalls) sono più lente delle normali chiamate, quindi in generale un'implementazione di malloc richiederà blocchi di grandi dimensioni al sistema operativo (blocchi 4KB o 8KB sono comuni) e li suddividono per servirli ai suoi chiamanti.

È necessario identificare se si è interessati alla memoria totale consumata dal processo (che include il codice stesso), alla memoria il processo richiesto dal sistema operativo in una particolare chiamata di procedura, la memoria effettivamente utilizzata dallo malloc implementazione (che aggiunge il proprio overhead di libro, per quanto piccolo) o la memoria è richiesta.

Inoltre, la frammentazione può essere un dolore per gli ultimi due e può in qualche modo offuscare le differenze tra realmente utilizzato e assegnato a.

2

Su Linux è possibile leggere /proc/[pid]/statm per ottenere informazioni sull'utilizzo della memoria.

Fornisce informazioni sull'utilizzo della memoria, misurate in pagine. Le colonne sono :

   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) 

Vedere la man page per maggiori dettagli.

risposta da Adam Zalcman a questo question descrive alcuni dettagli interessanti della ripartizione mucchio

+0

quali sono le unità? byte? o pagine? – weima

+0

Le unità sono pagine. Puoi usare getconf PAGE_SIZE per sapere quanto è grande una pagina in byte. –

0

Si può provare "mallinfo" e "malloc_info". Potrebbero funzionare. mallinfo ha problemi quando si allocano più di 2 GB.malloc_info è o/s specifico e in particolare molto strano. Sono d'accordo - molto spesso è bello fare questa roba senza strumenti di terze parti.

Problemi correlati