async-profiler - Cheatsheet del Profiler JVM a Basso Overhead
async-profiler è un profiler di sampling a basso overhead per la JVM. I profiler Java tradizionali campionano solo ai safepoint, il che distorce i risultati verso il codice che capita di stare vicino a un safepoint e può nascondere il vero percorso caldo. async-profiler usa AsyncGetCallTrace più perf events per campionare ovunque, incluso codice nativo e frame kernel, fornendo un quadro molto più onesto. Profila CPU, allocazioni, contesa di blocco e altro, ed esporta flame graph o JFR.
Installation
| Method | How |
|---|
| Download | Ottieni il tarball di rilascio per la tua piattaforma |
| Extract | tar xzf async-profiler-*.tar.gz |
| Run | ./bin/asprof <pid> (più nuovo) o ./profiler.sh <pid> |
| Permissions | potrebbe essere necessario sysctl kernel.perf_event_paranoid=1 e kernel.kptr_restrict=0 |
| Verify | ./bin/asprof --version |
Basic Profiling
| Command | Description |
|---|
asprof -d 30 -f out.html <pid> | Profila 30s → flame graph |
asprof -e alloc -d 30 -f alloc.html <pid> | Profiling di allocazione |
asprof -e lock -d 30 -f lock.html <pid> | Contesa di blocco |
asprof -e wall -d 30 -f wall.html <pid> | Wall-clock (include tempo di attesa) |
asprof start <pid> / asprof stop -f out.html <pid> | Start/stop manuale |
jps | Trova il pid della JVM |
Event Types
| Event | Measures |
|---|
cpu | Tempo CPU (predefinito) |
alloc | Allocazioni heap per stack |
lock | Contesa di blocco/monitor |
wall | Wall-clock incluso tempo bloccato |
itimer | Fallback quando perf non è disponibile |
cache-misses, page-faults | Perf events hardware/software |
# Where is the app actually spending wall-clock time (incl. IO waits)?
./bin/asprof -e wall -t -d 30 -f wall.html <pid>
| Flag | Produces |
|---|
-f out.html | Flame graph interattivo |
-o collapsed | Stack piegati (per tooling FlameGraph) |
-o tree | Albero di chiamate |
-o flat | Elenco piatto di hot-method |
-f out.jfr | Registrazione JFR (apri in JMC) |
-t | Dividi per thread |
Launching With the Agent
# Profile from JVM startup (captures warmup)
java -agentpath:/path/libasyncProfiler.so=start,event=cpu,file=profile.html \
-jar app.jar
| Agent option | Purpose |
|---|
start | Inizia immediatamente |
event=cpu|alloc|lock | Cosa campionare |
file=NAME | Percorso di output |
interval=10ms | Intervallo di campionamento |
jfr | Emetti formato JFR |
Reading the Flame Graph
| Feature | Meaning |
|---|
| Width | Quota di campioni (tempo) — più largo è più caldo |
| Height | Profondità dello stack, non costo |
| Colors | Java (verde), nativo (giallo-ish), kernel (arancione) |
| Click | Zoom in un sottoalbero |
| Search | Evidenzia frame corrispondenti |
Cerca altipiani larghi — un singolo frame che consuma una grande quota orizzontale è il tuo hot spot. Frame misti Java/nativo/kernel sono esattamente ciò che i profiler distorsioni da safepoint nascondono.
Common Workflows
# 1) CPU hotspots in a running service
./bin/asprof -d 60 -f cpu.html $(jps | grep MyApp | cut -d' ' -f1)
# 2) Chasing GC pressure — who allocates most?
./bin/asprof -e alloc -d 60 -f alloc.html <pid>
# 3) Threads look idle but latency is high → wall-clock
./bin/asprof -e wall -t -d 30 -f wall.html <pid>
# 4) Contention on a shared resource
./bin/asprof -e lock -d 30 -f lock.html <pid>
async-profiler vs Alternatives
| Aspect | async-profiler | JFR | VisualVM |
|---|
| Safepoint bias | Evitato | Ridotto | Presente |
| Native/kernel frames | Sì | Limitato | No |
| Overhead | Molto basso | Basso | Più alto |
| Allocation profiling | Sì | Sì | Di base |
| Best for | Hotspot JVM accurati | Registrazione continua integrata | Ispezione rapida GUI |
L”omologo JVM di perf + FlameGraph per codice nativo.
Resources