DHAT - Cheatsheet de Ferramenta de Análise Dinâmica de Heap
DHAT - Cheatsheet de Ferramenta de Análise Dinâmica de Heap
DHAT (Dynamic Heap Analysis Tool) é uma ferramenta Valgrind que responde a uma pergunta diferente da maioria dos perfiladores de memória. Em vez de apenas “quanto memória você alocou”, ela relata como aquela memória foi realmente usada: blocos que foram alocados mas nunca lidos, blocos escritos uma vez e nunca tocados novamente, alocações muito curta-vida, e alocações muito maiores que os bytes realmente acessados. Aquela visão de uso frequentemente revela desperdício que perfiladores de tamanho-apenas não conseguem ver.
Instalação
| Plataforma | Comando |
|---|---|
| Debian/Ubuntu | sudo apt install valgrind |
| Fedora/RHEL | sudo dnf install valgrind |
| Arch Linux | sudo pacman -S valgrind |
| macOS | suporte limitado; prefira Linux |
| Verificar | valgrind --tool=dhat --version |
Construa seu programa com
-gpara stack traces úteis. DHAT executa sob Valgrind, então espere uma desaceleração significativa — essa é uma ferramenta de análise, não um perfilador de produção.
Executando DHAT
valgrind --tool=dhat ./my-program
# → produz dhat.out.<pid>
| Opção | Propósito |
|---|---|
--dhat-out-file=FILE | Caminho de saída |
--mode=heap | Perfilamento de heap padrão |
--mode=copy | Perfila cópia de memória (memcpy etc.) |
--mode=ad-hoc | Pontos de instrumentação customizados |
--num-callers=N | Profundidade de stack em relatórios |
Visualizando Resultados
A saída DHAT é JSON, visualizada no visualizador HTML fornecido:
# Abra o visualizador e carregue dhat.out.<pid>
firefox /usr/libexec/valgrind/dh_view.html
| Elemento de UI | Mostra |
|---|---|
| Árvore de pontos de alocação | Agrupado por call stack |
| Total / max bytes | Volume por site |
| Reads / writes | Quanto a memória foi realmente acessada |
| Lifetimes | Quanto tempo blocos viveram |
| Sorting | Por qualquer métrica para encontrar os piores infratores |
Os Métricas que Importam
| Métrica | Revela |
|---|---|
| Total bytes | Volume geral de alocação deste site |
| Max bytes | Uso simultâneo máximo |
| Reads / writes | Intensidade de acesso |
| Reads = 0 | Alocado mas nunca lido — desperdício puro |
| Writes = 0 | Nunca inicializado — provavelmente um bug ou desperdício |
| Short lifetimes | Churn; candidatos para stack/pooling |
| Access ratio | Bytes acessados vs bytes alocados |
O caso “reads = 0” é a descoberta clássica de DHAT: memória que um programa diligentemente aloca, preenche e libera sem nada jamais lê-la.
Descobertas Comuns e Correções
| Descoberta | Provável correção |
|---|---|
| Muitas alocações tiny curta-vida | Alocação de stack, arena ou object pool |
| Bloco grande, porção tiny acessada | Aloque apenas o que você usa; carregamento lazy |
| Alocações nunca-lidas | Apague o trabalho inteiramente |
| Alloc/free repetido do mesmo tamanho | Reutilize um buffer |
| Containers oversized | Reserve capacidade precisa |
Modo Copy
valgrind --tool=dhat --mode=copy ./my-program
O modo Copy perfila volume de memcpy/memmove por site de chamada — útil quando perfilamento mostra tempo em cópia e você precisa saber qual código é responsável.
Modo Ad-Hoc
O modo Ad-Hoc permite que você conte eventos arbitrários anotando seu código com requisições de cliente DHAT, transformando DHAT em um contador geral de “qual call stack faz isto mais”.
DHAT vs Ferramentas Relacionadas
| Aspecto | DHAT | massif | heaptrack | Bytehound |
|---|---|---|---|---|
| Foco | Como memória é usada | Uso máximo ao longo do tempo | Perfilamento de alocação | Exploração interativa |
| Sobrecarga | Alta (Valgrind) | Alta (Valgrind) | Baixa | Baixa |
| Insight único | Blocos não lidos/subutilizados | Snapshots de máximo | Churn + vazamentos | Filtragem rica |
| Melhor para | Encontrando trabalho desperdiçado | Redução de máximo | Execuções realistas rápidas | Análise interativa profunda |
Use heaptrack ou Bytehound para perfilamento de baixa sobrecarga de execuções realistas; alcance DHAT quando você quer saber se a memória alocada foi realmente usada.