Salta ai contenuti

DHAT - Strumento Dinamico di Analisi Heap

DHAT - Strumento Dinamico di Analisi Heap Cheatsheet

DHAT (Dynamic Heap Analysis Tool) è un tool Valgrind che risponde a una domanda diversa dalla maggior parte dei profiler di memoria. Invece di solo “quanta memoria hai allocato”, riporta come quella memoria è stata effettivamente usata: blocchi che sono stati allocati ma mai letti, blocchi scritti una volta e mai più toccati, allocazioni molto brevi, e allocazioni molto più grandi dei byte effettivamente acceduti. Quella vista di uso spesso rivela spreco che i profiler basati solo su dimensione non possono vedere.

Installazione

PiattaformaComando
Debian/Ubuntusudo apt install valgrind
Fedora/RHELsudo dnf install valgrind
Arch Linuxsudo pacman -S valgrind
macOSsupporto limitato; preferisci Linux
Verificavalgrind --tool=dhat --version

Costruisci il tuo programma con -g per utili stack trace. DHAT viene eseguito sotto Valgrind, quindi aspettati un rallentamento significativo — questo è uno strumento di analisi, non un profiler di produzione.

Esecuzione di DHAT

valgrind --tool=dhat ./my-program
# → produce dhat.out.<pid>
OpzioneScopo
--dhat-out-file=FILEPercorso di output
--mode=heapProfiling heap predefinito
--mode=copyProfila copia di memoria (memcpy ecc.)
--mode=ad-hocPunti di strumentazione personalizzati
--num-callers=NProfondità dello stack nei report

Visualizzazione dei Risultati

L”output di DHAT è JSON, visualizzato nel viewer HTML fornito:

# Apri il viewer e carica dhat.out.<pid>
firefox /usr/libexec/valgrind/dh_view.html
Elemento dell”UIMostra
Albero dei punti di allocazioneRaggruppato per stack di chiamate
Byte totali / maxVolume per sito
Letture / scrittureQuanto la memoria è stata effettivamente acceduta
LifetimeQuanto a lungo i blocchi sono rimasti vivi
OrdinamentoPer qualsiasi metrica per trovare i peggiori trasgressori

Le Metriche Che Contano

MetricaRivela
Byte totaliVolume di allocazione complessivo da questo sito
Byte maxUso simultaneo di picco
Letture / scrittureIntensità di accesso
Letture = 0Allocato ma mai letto — spreco puro
Scritture = 0Mai inizializzato — probabilmente un bug o spreco
Lifetime breviChurn; candidati per stack/pooling
Rapporto di accessoByte acceduti vs byte allocati

Il caso “reads = 0” è il classico trovato di DHAT: memoria che un programma diligentemente alloca, riempie e libera senza che nulla mai la legga.

Risultati Comuni e Fix

RisultatoFix Probabile
Molte allocazioni piccole breviAllocazione su stack, arena o object pool
Blocco grande, porzione acceduta piccolaAlloca solo quello che usi; caricamento lazy
Allocazioni mai letteElimina il lavoro interamente
Alloc/free ripetuti della stessa dimensioneRiusa un buffer
Container sovradimensionatiRiserva capacità accurata

Modalità Copia

valgrind --tool=dhat --mode=copy ./my-program

La modalità copia profila il volume di memcpy/memmove per sito di chiamata — utile quando il profiling mostra tempo in copia e hai bisogno di sapere quale codice è responsabile.

Modalità Ad-Hoc

La modalità ad-hoc ti consente di contare eventi arbitrari annotando il tuo codice con richieste di client DHAT, trasformando DHAT in un contatore generale “quale stack di chiamate fa di più questo”.

DHAT vs Tool Correlati

AspettoDHATmassifheaptrackBytehound
FocusCome la memoria è usataUso di picco nel tempoProfiling di allocazioneEsplorazione interattiva
OverheadAlto (Valgrind)Alto (Valgrind)BassoBasso
Insight unicoBlocchi non letti/sottoutilizzatiSnapshot di piccoChurn + leakFiltrazione ricca
Migliore perTrovare lavoro sprecatoRiduzione di piccoEsecuzioni veloci e realisticheAnalisi interattiva profonda

Usa heaptrack o Bytehound per profiling a basso overhead di esecuzioni realistiche; ricorri a DHAT quando vuoi sapere se la memoria allocata è stata effettivamente usata.

Risorse