Pular para o conteúdo

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

PlataformaComando
Debian/Ubuntusudo apt install valgrind
Fedora/RHELsudo dnf install valgrind
Arch Linuxsudo pacman -S valgrind
macOSsuporte limitado; prefira Linux
Verificarvalgrind --tool=dhat --version

Construa seu programa com -g para 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çãoPropósito
--dhat-out-file=FILECaminho de saída
--mode=heapPerfilamento de heap padrão
--mode=copyPerfila cópia de memória (memcpy etc.)
--mode=ad-hocPontos de instrumentação customizados
--num-callers=NProfundidade 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 UIMostra
Árvore de pontos de alocaçãoAgrupado por call stack
Total / max bytesVolume por site
Reads / writesQuanto a memória foi realmente acessada
LifetimesQuanto tempo blocos viveram
SortingPor qualquer métrica para encontrar os piores infratores

Os Métricas que Importam

MétricaRevela
Total bytesVolume geral de alocação deste site
Max bytesUso simultâneo máximo
Reads / writesIntensidade de acesso
Reads = 0Alocado mas nunca lido — desperdício puro
Writes = 0Nunca inicializado — provavelmente um bug ou desperdício
Short lifetimesChurn; candidatos para stack/pooling
Access ratioBytes 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

DescobertaProvável correção
Muitas alocações tiny curta-vidaAlocação de stack, arena ou object pool
Bloco grande, porção tiny acessadaAloque apenas o que você usa; carregamento lazy
Alocações nunca-lidasApague o trabalho inteiramente
Alloc/free repetido do mesmo tamanhoReutilize um buffer
Containers oversizedReserve 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

AspectoDHATmassifheaptrackBytehound
FocoComo memória é usadaUso máximo ao longo do tempoPerfilamento de alocaçãoExploração interativa
SobrecargaAlta (Valgrind)Alta (Valgrind)BaixaBaixa
Insight únicoBlocos não lidos/subutilizadosSnapshots de máximoChurn + vazamentosFiltragem rica
Melhor paraEncontrando trabalho desperdiçadoRedução de máximoExecuções realistas rápidasAná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.

Recursos