Aller au contenu

DHAT - Outil d'Analyse Dynamique du Heap

DHAT - Outil d’Analyse Dynamique du Heap

DHAT (Dynamic Heap Analysis Tool) est un outil Valgrind qui répond à une question différente de celle de la plupart des profileurs de mémoire. Plutôt que seulement « combien de mémoire avez-vous alloué », il signale comment cette mémoire a été réellement utilisée : blocs alloués mais jamais lus, blocs écrits une fois et jamais touchés à nouveau, allocations très courte durée, et allocations beaucoup plus grandes que les octets réellement accédés. Cette vue d’utilisation révèle souvent du gaspillage que les profileurs basés sur la taille ne peuvent pas voir.

Installation

PlateformeCommande
Debian/Ubuntusudo apt install valgrind
Fedora/RHELsudo dnf install valgrind
Arch Linuxsudo pacman -S valgrind
macOSsupport limité ; préférer Linux
Vérifiervalgrind --tool=dhat --version

Construire votre programme avec -g pour les traces de pile utiles. DHAT s’exécute sous Valgrind, donc attendez un ralentissement significatif — c’est un outil d’analyse, pas un profileur de production.

Exécution de DHAT

valgrind --tool=dhat ./my-program
# → produit dhat.out.<pid>
OptionObjectif
--dhat-out-file=FILEChemin de sortie
--mode=heapProfilage du heap par défaut
--mode=copyProfiler la copie mémoire (memcpy etc.)
--mode=ad-hocPoints d’instrumentation personnalisés
--num-callers=NProfondeur de pile dans les rapports

Affichage des Résultats

La sortie de DHAT est JSON, affichée dans la visionneuse HTML fournie :

# Ouvrir la visionneuse et charger dhat.out.<pid>
firefox /usr/libexec/valgrind/dh_view.html
Élément UIAffiche
Arborescence des points d’allocationGroupé par pile d’appels
Total / max octetsVolume par site
Lectures / écrituresCombien la mémoire a été réellement accédée
Durées de vieCombien de temps les blocs ont vécu
TriPar n’importe quelle métrique pour trouver les pires contrevenants

Les Métriques qui Comptent

MétriqueRévèle
Total octetsVolume d’allocation global du site
Max octetsUtilisation simultanée de pointe
Lectures / écrituresIntensité d’accès
Lectures = 0Alloué mais jamais lu — pur gaspillage
Écritures = 0Jamais initialisé — probablement un bug ou du gaspillage
Courtes durées de vieChurn ; candidats pour pile/pooling
Rapport d’accèsOctets accédés vs octets alloués

Le cas « lectures = 0 » est la trouvaille classique de DHAT : mémoire qu’un programme alloue diligemment, remplit et libère sans que rien ne la lise jamais.

Constatations Courantes et Corrections

ConstatationCorrection Probable
Nombreuses petites allocations courte duréeAllocation de pile, arena ou pool d’objets
Grand bloc, petite portion accédéeAllouer seulement ce que vous utilisez ; chargement paresseux
Allocations jamais luesSupprimer le travail entièrement
Alloc/free répété de même tailleRéutiliser un tampon
Conteneurs surdimensionnésRéserver une capacité précise

Mode Copie

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

Le mode copie profile le volume memcpy/memmove par site d’appel — utile quand le profilage affiche du temps dans la copie et vous avez besoin de savoir quel code en est responsable.

Mode Ad-Hoc

Le mode ad-hoc vous permet de compter des événements arbitraires en annotant votre code avec les demandes de client DHAT, transformant DHAT en un compteur général « quelle pile d’appels le fait le plus ».

DHAT vs Outils Associés

AspectDHATmassifheaptrackBytehound
FocusComment la mémoire est utiliséeUtilisation de pointe au fil du tempsProfilage d’allocationExploration interactive
SurchargeÉlevée (Valgrind)Élevée (Valgrind)BasseBasse
Insight uniqueBlocs non lus/sous-utilisésSnapshots de pointeChurn + fuitesFiltrage riche
Meilleur pourTrouver le travail gaspilléRéduction de pointeExécutions rapides réalistesAnalyse interactive approfondie

Utilisez heaptrack ou Bytehound pour le profilage bas surcharge des exécutions réalistes ; préférez DHAT quand vous voulez savoir si la mémoire allouée a été réellement utilisée.

Ressources