Understanding Flame Graphs for Java Performance Analysis
This article introduces flame graphs, explains their visual characteristics and how they help identify performance bottlenecks in Java applications, and provides practical guidance on generating them using Perl scripts and shell commands to process jstack and perf outputs.
Tools evolve with productivity, and using the right tool can dramatically improve efficiency; the author loves shell for its powerful text processing capabilities but notes its limitations for visualizing relative and multidimensional data.
When analyzing performance, a flame graph—a SVG interactive visualization—helps reveal call‑stack relationships and frequency, making it easier to pinpoint hot paths in Java applications.
Flame graphs are generated from collapsed stack traces; the author demonstrates extracting thread states with a shell pipeline:
grep --no-group-separator -A 1 java.lang.Thread.State jstack.log | awk 'NR%2==0' | sort | uniq -c | sort -nrThe underlying principle is similar to counting ad appearances on a billboard: the more often a stack appears, the more time the application spends there.
Key features of flame graphs include:
Bottom‑to‑top call‑chain tracing where each block’s parent is below it.
Blocks at the same level sorted alphabetically.
Block labels show the function name, occurrence count, and width percentage.
Colors are purely for visual distinction.
When interpreting a flame graph, focus on block widths (frequency) and especially on wide blocks at the top without children—these indicate functions that dominate execution time.
Typical use cases are loop/CPU‑bound analysis, I/O or lock contention detection, and inverted analysis to aggregate time spent in a common method across many call paths.
To generate flame graphs, Brendan Gregg’s flamegraph.pl Perl script is used. It accepts collapsed stack data such as:
a;b;c 12
a;d 3
b;c 3
z;d 5
a;c;e 3Data preparation tools include stackcollapse-perf.pl for perf output, stackcollapse-jstack.pl for jstack dumps, and stackcollapse-gdb.pl for gdb traces. A simple shell one‑liner can also collapse jstack output:
grep -v -P '.+prio=d+ os_prio=d+' | grep -v -E 'locked <' | awk '{if ($0==""){print $0}else{printf"%s;",$0}}' | sort | uniq -c | awk '{a=$1;$1="";print $0,a}'In summary, flame graphs provide a powerful visual method for diagnosing performance issues, complementing traditional shell‑based analysis, and the author encourages readers to adopt this tool in their troubleshooting workflow.
Code Ape Tech Column
Former Ant Group P8 engineer, pure technologist, sharing full‑stack Java, job interview and career advice through a column. Site: java-family.cn
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.