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

AI-assisted

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.

Close
?
You’ll profile a Java HTTP workload on an Arm Neoverse server by applying repeatable load with Tomcat and 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

AI-assisted

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.

Close
?
Which process ID should I target when running async-profiler?
Profile the Tomcat process. Use your system’s process listing to find the PID, and start profiling while wrk2 is actively generating load.
Do I need to install async-profiler on the same machine as Tomcat?
Yes. Install and run async-profiler on the same Arm-based Linux machine where Tomcat is running to ensure accurate profiling.
Where should I run wrk2 to generate load?
Run 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.
How do I confirm that perf is capturing Java method names with the JVMTI agent?
Check that the profile output shows Java method names rather than raw memory addresses. If the output doesn’t, verify that libperf-jvmti.so is present and loaded by the JVM.
What should I look for in the generated flame graphs?
Open 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.
Next