DHAT - Dynamic Heap Analysis Tool Cheatsheet
DHAT - Dynamic Heap Analysis Tool Cheatsheet
DHAT (Dynamic Heap Analysis Tool) ist ein Valgrind-Tool, das eine andere Frage beantwortet als die meisten Memory Profiler. Anstatt nur “wie viel Speicher hast du allocated”, berichtet es wie dieser Speicher tatsächlich verwendet wurde: Blöcke, die allocated aber nie gelesen wurden, Blöcke, einmal geschrieben und dann nie berührt, sehr kurzlebige Allocations und Allocations viel größer als die tatsächlich zugegriffenen Bytes. Diese Nutzungsansicht offenbart oft Verschwendung, die reine Größe-Profiler nicht sehen können.
Installation
| Plattform | Befehl |
|---|---|
| Debian/Ubuntu | sudo apt install valgrind |
| Fedora/RHEL | sudo dnf install valgrind |
| Arch Linux | sudo pacman -S valgrind |
| macOS | Begrenzte Unterstützung; bevorzuge Linux |
| Überprüfung | valgrind --tool=dhat --version |
Baue dein Programm mit
-gfür nützliche Stack-Traces. DHAT läuft unter Valgrind, also erwartet einen erheblichen Slowdown — das ist ein Analysis-Tool, kein Production-Profiler.
DHAT ausführen
valgrind --tool=dhat ./my-program
# → erzeugt dhat.out.<pid>
| Option | Zweck |
|---|---|
--dhat-out-file=FILE | Output-Pfad |
--mode=heap | Standard Heap-Profiling |
--mode=copy | Profiliere Memory-Kopieren (memcpy etc.) |
--mode=ad-hoc | Benutzerdefinierte Instrumentierungspunkte |
--num-callers=N | Stack-Tiefe in Reports |
Ergebnisse anschauen
DHAT-Output ist JSON, anschauen im gebündel HTML-Viewer:
# Öffne den Viewer und lade dhat.out.<pid>
firefox /usr/libexec/valgrind/dh_view.html
| UI-Element | Zeigt |
|---|---|
| Baum der Allocation-Punkte | Gruppiert nach Call-Stack |
| Gesamt / Max Bytes | Volumen pro Stelle |
| Reads / Writes | Wie viel der Speicher tatsächlich zugegriffen wurde |
| Lifetimes | Wie lange Blöcke lebten |
| Sortierung | Nach jeder Metrik um die schlimmsten Übertreter zu finden |
Die wichtigen Metriken
| Metrik | Offenbart |
|---|---|
| Gesamt Bytes | Gesamtes Allocation-Volumen von dieser Stelle |
| Max Bytes | Peak-gleichzeitige Nutzung |
| Reads / Writes | Zugriffs-Intensität |
| Reads = 0 | Allocated aber nie gelesen — reine Verschwendung |
| Writes = 0 | Nie initialisiert — wahrscheinlich ein Bug oder Verschwendung |
| Kurze Lifetimes | Churn; Kandidaten für Stack/Pooling |
| Zugriffs-Verhältnis | Zugegriffene Bytes vs Allocated Bytes |
Der Fall “Reads = 0” ist der klassische DHAT-Fund: Speicher, den ein Programm pflichtbewusst allociert, füllt und freigibt, ohne dass etwas ihn je liest.
Häufige Befunde und Fixes
| Befund | Wahrscheinlicher Fix |
|---|---|
| Viele winzige kurzlebige Allocations | Stack-Allocation, Arena oder Objektpool |
| Großer Block, winziger Zugriffsteil | Allociere nur was du nutzt; Lazy Load |
| Nie-gelesen Allocations | Löschen die Arbeit ganz |
| Wiederholtes Alloc/Free der gleichen Größe | Wiederverwendung eines Buffer |
| Oversized Container | Reserve genaue Kapazität |
Copy-Modus
valgrind --tool=dhat --mode=copy ./my-program
Copy-Modus profiliert memcpy/memmove Volumen nach Call-Site — nützlich, wenn Profiling Zeit in Kopieren zeigt und du wissen musst, welcher Code dafür verantwortlich ist.
Ad-Hoc-Modus
Ad-Hoc-Modus lässt dich willkürliche Ereignisse zählen, indem du deinen Code mit DHAT-Client-Anfragen kommentierst, und verwandelt DHAT in einen allgemeinen “welcher Call-Stack tut das am meisten” Zähler.
DHAT vs ähnliche Tools
| Aspekt | DHAT | massif | heaptrack | Bytehound |
|---|---|---|---|---|
| Fokus | Wie Speicher wird benutzt | Peak-Nutzung über die Zeit | Allocation-Profiling | Interaktive Exploration |
| Overhead | Hoch (Valgrind) | Hoch (Valgrind) | Niedrig | Niedrig |
| Unique Insight | Ungelesen/unternutzte Blöcke | Peak-Snapshots | Churn + Lecks | Reiche Filterung |
| Bestes für | Vergeudete Arbeit finden | Peak-Reduktion | Schnelle realistische Läufe | Tiefe interaktive Analyse |
Verwende heaptrack oder Bytehound für Niedrig-Overhead-Profiling realistischer Läufe; greife zu DHAT, wenn du wissen willst, ob allocated Speicher je tatsächlich verwendet wurde.