Analyze Java performance on Arm servers using flame graphs
Introduction
Set up Tomcat benchmark environment
Generate Java flame graphs using async-profiler
Generate Java flame graphs using a Java agent
Next Steps
Analyze Java performance on Arm servers using flame graphs
Who is this for?
This is an introductory topic for developers who want to analyze the performance of Java applications on Arm Neoverse-based servers using flame graphs.
What will you learn?
Upon completion of this Learning Path, you will be able to:
- Set up a benchmarking environment using Tomcat and wrk2.
- Generate flame graphs using async-profiler.
- Generate flame graphs using a Java agent.
Prerequisites
Before starting, you will need the following:
- Access to both Arm-based and x86-based computers running Ubuntu, or cloud-based server instances
- Basic familiarity with Java applications and performance profiling using flame graphs
Summary
This summary was drafted with an approved AI-assisted workflow and reviewed by Arm contributors before publication. Human technical review remains part of the process so the final page reflects engineering rigor, accuracy, and Arm editorial standards.
wrk2. First, you’ll capture CPU samples with async-profiler and generate a flame graph. Then, you’ll profile with a Java Virtual Machine Tool Interface (JVMTI) agent and the FlameGraph toolkit. You’ll compare both views to identify the methods and call stacks that dominate execution under load.Frequently asked questions
These FAQs were drafted with an approved AI-assisted workflow and reviewed by Arm contributors before publication. Human technical review remains part of the process so the final page reflects engineering rigor, accuracy, and Arm editorial standards.
wrk2 is actively generating load.async-profiler on the same Arm-based Linux machine where Tomcat is running to ensure accurate profiling.wrk2 from an x86_64 Ubuntu client so that it sends HTTP requests to the Tomcat server that you’re profiling. Confirm that you can reach the Tomcat endpoint before starting the benchmark.libperf-jvmti.so is present and loaded by the JVM.profile.svg in a browser to analyze the sampled profiling result from the benchmark. Expect a visualization of sampled stacks during the benchmark. The widest stacks indicate where time is spent, so that you can focus on the hottest Java methods and code paths.