Zum Inhalt springen

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

PlattformBefehl
Debian/Ubuntusudo apt install valgrind
Fedora/RHELsudo dnf install valgrind
Arch Linuxsudo pacman -S valgrind
macOSBegrenzte Unterstützung; bevorzuge Linux
Überprüfungvalgrind --tool=dhat --version

Baue dein Programm mit -g fü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>
OptionZweck
--dhat-out-file=FILEOutput-Pfad
--mode=heapStandard Heap-Profiling
--mode=copyProfiliere Memory-Kopieren (memcpy etc.)
--mode=ad-hocBenutzerdefinierte Instrumentierungspunkte
--num-callers=NStack-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-ElementZeigt
Baum der Allocation-PunkteGruppiert nach Call-Stack
Gesamt / Max BytesVolumen pro Stelle
Reads / WritesWie viel der Speicher tatsächlich zugegriffen wurde
LifetimesWie lange Blöcke lebten
SortierungNach jeder Metrik um die schlimmsten Übertreter zu finden

Die wichtigen Metriken

MetrikOffenbart
Gesamt BytesGesamtes Allocation-Volumen von dieser Stelle
Max BytesPeak-gleichzeitige Nutzung
Reads / WritesZugriffs-Intensität
Reads = 0Allocated aber nie gelesen — reine Verschwendung
Writes = 0Nie initialisiert — wahrscheinlich ein Bug oder Verschwendung
Kurze LifetimesChurn; Kandidaten für Stack/Pooling
Zugriffs-VerhältnisZugegriffene 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

BefundWahrscheinlicher Fix
Viele winzige kurzlebige AllocationsStack-Allocation, Arena oder Objektpool
Großer Block, winziger ZugriffsteilAllociere nur was du nutzt; Lazy Load
Nie-gelesen AllocationsLöschen die Arbeit ganz
Wiederholtes Alloc/Free der gleichen GrößeWiederverwendung eines Buffer
Oversized ContainerReserve 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

AspektDHATmassifheaptrackBytehound
FokusWie Speicher wird benutztPeak-Nutzung über die ZeitAllocation-ProfilingInteraktive Exploration
OverheadHoch (Valgrind)Hoch (Valgrind)NiedrigNiedrig
Unique InsightUngelesen/unternutzte BlöckePeak-SnapshotsChurn + LecksReiche Filterung
Bestes fürVergeudete Arbeit findenPeak-ReduktionSchnelle realistische LäufeTiefe 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.

Ressourcen