How to Diagnose High CPU Usage in a Java Program (Three‑Step Guide)
This article explains a three‑step method—using top to locate the CPU‑hungry Java process, identifying the offending thread, and printing its stack with jstack—to pinpoint and resolve excessive CPU consumption in a Java application running on Linux.
When a Java program consumes excessive CPU (even reaching 100%), you can troubleshoot it in three steps: first, use the top command to find the process with the highest CPU usage; second, locate the specific thread inside that process; third, print the thread's stack trace for analysis.
Preparation
Create a Java program that performs intensive calculations:
package com.sample.core.cpu;
public class CpuFullExample {
private static final int times = 100000000;
public static void main(String[] args) {
for (int i = 0; i < times; i++) {
Math.pow(2, i);
}
}
}Compile and run it on a Linux system:
java com.sample.core.cpu.CpuFullExampleStep 1: Find the Process
Run top and observe the process ID (PID) that consumes the most CPU, e.g., PID 2411 with 99% usage.
Step 2: Find the Thread
Use top -Hp 2411 to list threads of the process and identify the thread ID (TID) with the highest CPU, e.g., TID 2412.
top -Hp 2411Convert the decimal thread ID to hexadecimal:
printf '%x
' 2412The result is 96c .
Step 3: Print the Thread Stack
Use jstack to dump the stack of the process and filter for the thread using its hexadecimal ID:
jstack 2411 | grep -A 10 96cThe output shows the stack trace, indicating the problem occurs at line 6 of CpuFullExample , where the intensive calculation is performed.
By following these steps, you can clearly identify the exact location of the performance bottleneck in the Java code.
Credits: https://www.jianshu.com/p/a455ac8a3ef0
Full-Stack Internet Architecture
Introducing full-stack Internet architecture technologies centered on Java
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.