Come profilo l’utilizzo della memoria?

Sono a conoscenza di Valgrind, ma rileva solo problemi di gestione della memoria. Quello che sto cercando è uno strumento che mi fornisce una panoramica, quali parti del mio programma consumano quanta memoria. Una rappresentazione grafica con ad es. Una mappa ad albero (come fa KCachegrind per Callgrind) sarebbe interessante.

Sto lavorando su una macchina Linux, quindi gli strumenti di Windows non mi aiuteranno molto.

Usa il massiccio , che fa parte degli strumenti di Valgrind. massif-visualizer può aiutarti a rappresentare graficamente i dati oppure puoi semplicemente usare il comando ms_print .

Prova il profiler dell’heap fornito con gperftools , da Google. L’ho sempre creato da fonti, ma è disponibile come pacchetto precompilato in diverse distribuzioni Linux.

È semplice da usare come colbind una libreria dynamic ai tuoi eseguibili ed eseguire il programma. Raccoglie informazioni su ogni allocazione di memoria dynamic (per quanto ho visto) e salva su disco un dump della memoria ogni volta che si verifica una delle seguenti situazioni:

  • HEAP_PROFILE_ALLOCATION_INTERVAL byte sono stati assegnati dal programma (default: 1Gb)
  • il segno di utilizzo della memoria dell’acqua alta aumenta di HEAP_PROFILE_INUSE_INTERVAL byte (valore predefinito: 100Mb)
  • Sono passati HEAP_PROFILE_TIME_INTERVAL secondi (predefinito: inattivo)
  • Chiami esplicitamente HeapProfilerDump() dal tuo codice

L’ultimo, secondo la mia esperienza, è il più utile perché puoi controllare esattamente quando avere un’istantanea dell’utilizzo dell’heap e quindi confrontare due diverse istantanee e vedere cosa c’è che non va.

Alla fine, ci sono diversi formati di output possibili, come testuali o grafici (sotto forma di grafico diretto):

Grafico dell'utilizzo della memoria

Usando questo strumento sono stato in grado di individuare usi di memoria errati che non riuscivo a trovare usando Massif.