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
| Plateforme | Commande |
|---|---|
| Debian/Ubuntu | sudo apt install valgrind |
| Fedora/RHEL | sudo dnf install valgrind |
| Arch Linux | sudo pacman -S valgrind |
| macOS | support limité ; préférer Linux |
| Vérifier | valgrind --tool=dhat --version |
Construire votre programme avec
-gpour 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>
| Option | Objectif |
|---|---|
--dhat-out-file=FILE | Chemin de sortie |
--mode=heap | Profilage du heap par défaut |
--mode=copy | Profiler la copie mémoire (memcpy etc.) |
--mode=ad-hoc | Points d’instrumentation personnalisés |
--num-callers=N | Profondeur 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 UI | Affiche |
|---|---|
| Arborescence des points d’allocation | Groupé par pile d’appels |
| Total / max octets | Volume par site |
| Lectures / écritures | Combien la mémoire a été réellement accédée |
| Durées de vie | Combien de temps les blocs ont vécu |
| Tri | Par n’importe quelle métrique pour trouver les pires contrevenants |
Les Métriques qui Comptent
| Métrique | Révèle |
|---|---|
| Total octets | Volume d’allocation global du site |
| Max octets | Utilisation simultanée de pointe |
| Lectures / écritures | Intensité d’accès |
| Lectures = 0 | Alloué mais jamais lu — pur gaspillage |
| Écritures = 0 | Jamais initialisé — probablement un bug ou du gaspillage |
| Courtes durées de vie | Churn ; candidats pour pile/pooling |
| Rapport d’accès | Octets 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
| Constatation | Correction Probable |
|---|---|
| Nombreuses petites allocations courte durée | Allocation de pile, arena ou pool d’objets |
| Grand bloc, petite portion accédée | Allouer seulement ce que vous utilisez ; chargement paresseux |
| Allocations jamais lues | Supprimer le travail entièrement |
| Alloc/free répété de même taille | Réutiliser un tampon |
| Conteneurs surdimensionnés | Ré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
| Aspect | DHAT | massif | heaptrack | Bytehound |
|---|---|---|---|---|
| Focus | Comment la mémoire est utilisée | Utilisation de pointe au fil du temps | Profilage d’allocation | Exploration interactive |
| Surcharge | Élevée (Valgrind) | Élevée (Valgrind) | Basse | Basse |
| Insight unique | Blocs non lus/sous-utilisés | Snapshots de pointe | Churn + fuites | Filtrage riche |
| Meilleur pour | Trouver le travail gaspillé | Réduction de pointe | Exécutions rapides réalistes | Analyse 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.