High CPU load: finding the responsible Java thread in Linux/Unix


If a running Java application on a machine generates (too) much CPU load it is often necessary to identify the Java thread which is responsible for this behaviour. On a Linux or Unix environment this can easily be done by using a shell:

Finding the problematic Java process

The “top”-command which shows tasks sorted by load intensity is available on nearly all installations:

$ top

Analysing the given table it is quite simple to find out the PID (process id) of the Java process that causes the problem.
Another way is to use the “ps” command to identify the process:

$ ps axu | grep java

Creating a thread dump

Next step is to create a thread dump using the command “jstack”. This command is part of the JDK, so it is normally available per default. “jstack” needs the PID of the Java process given as parameter. If “jstack” hangs or does not respond it has to be forced to take the dump using the “-F” parameter. It is also a good idea write its output into a file, an example with PID=12345 that writes a file into “/tmp” directory:

$ jstack -F 12345 > /tmp/heapdump

Identifying the problematic Java thread(s)

The “top” command is also able to display all threads of a task by pressing “H” when started or using the “-H” parameter:

$ top -H

So this time the PID(s) of problematic thread(s) can also be found out.

Now it is possible to find information about the thread(s) causing the problem by searching the heapdump file for these PIDs, assuming a PID is 32145:

-in a dump created with Java 7 and newer a PID can be found directly, for example:
Thread 32145: (state = IN_NATIVE)

-in a dump created with Java 6 and earlier it is necessary to convert the PID to a HEX value, also using BASH for example:

$ printf '%x\n' 32145

The result for this example is “7d91” and can be found in heapdump file as an “nid”, for example:
“Thread-0” prio=10 tid=0x00002f6a98760000 nid=0x7d91 runnable [0x00001f9a4d123000]

,