Tutorial

Java Thread Dump - VisualVM, jstack, kill -3, jcmd

Published on August 3, 2022
author

Pankaj

Java Thread Dump - VisualVM, jstack, kill -3, jcmd

Java Thread dump is list of all the threads active in the JVM.

Java Thread Dump

Java thread dump is very helpful in analyzing bottlenecks in the application and deadlock situations. Here we will learn multiple ways through which we can generate thread dump for a java program. These instructions are valid for *nix operating systems but in windows the steps might be little different.

  1. VisualVM Profiler: If you are analyzing application for slowness, you must use a profiler. We can generate thread dump for any process using VisualVM profiler very easily. You just need to right click on the running process and click on “Thread Dump” option to generate it. java thread dump, visualvm profiler
  2. jstack: Java comes with jstack tool through which we can generate thread dump for a java process. This is a two step process.
    1. Find out the PID of the java process using ps -eaf | grep java command
    2. Run jstack tool as jstack PID to generate the thread dump output to console, you can append thread dump output to file using command “jstack PID >> mydumps.tdump
  3. We can use kill -3 PID command to generate the thread dump. This is slightly different from other ways to generate thread dump. When kill command is issued, thread dump is generated to the System out of the program. So if it’s a java program with console as system out, the thread dump will get printed on the console. If the java program is a Tomcat server with system out as catalina.out, then thread dump will be generated in the file.
  4. Java 8 has introduced jcmd utility. You should use this instead of jstack if you are on Java 8 or higher. Command to generate thread dump using jcmd is jcmd PID Thread.print.

Above are four different ways to generate thread dump in java. Usually I prefer jstack or jcmd command to generate thread dump and analyze. Note that whatever way you choose, thread dump will always be the same.

Java Thread Dump Example

In my last post, I explained about java Timer, here is a thread dump generated for the same program.

2012-12-26 22:28:39
Full thread dump Java HotSpot(TM) 64-Bit Server VM (23.5-b02 mixed mode):

"Attach Listener" daemon prio=5 tid=0x00007fb7d8000000 nid=0x4207 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Timer-0" daemon prio=5 tid=0x00007fb7d4867000 nid=0x5503 waiting on condition [0x00000001604d9000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
	at java.lang.Thread.sleep(Native Method)
	at com.journaldev.threads.MyTimerTask.completeTask(MyTimerTask.java:19)
	at com.journaldev.threads.MyTimerTask.run(MyTimerTask.java:12)
	at java.util.TimerThread.mainLoop(Timer.java:555)
	at java.util.TimerThread.run(Timer.java:505)

"Service Thread" daemon prio=5 tid=0x00007fb7d482c000 nid=0x5303 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread1" daemon prio=5 tid=0x00007fb7d482b800 nid=0x5203 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" daemon prio=5 tid=0x00007fb7d4829800 nid=0x5103 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" daemon prio=5 tid=0x00007fb7d4828800 nid=0x5003 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" daemon prio=5 tid=0x00007fb7d4812000 nid=0x3f03 in Object.wait() [0x000000015fd26000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x0000000140a25798> (a java.lang.ref.ReferenceQueue$Lock)
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
	- locked <0x0000000140a25798> (a java.lang.ref.ReferenceQueue$Lock)
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
	at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:177)

"Reference Handler" daemon prio=5 tid=0x00007fb7d4811800 nid=0x3e03 in Object.wait() [0x000000015fc23000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x0000000140a25320> (a java.lang.ref.Reference$Lock)
	at java.lang.Object.wait(Object.java:503)
	at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
	- locked <0x0000000140a25320> (a java.lang.ref.Reference$Lock)

"main" prio=5 tid=0x00007fb7d5000800 nid=0x1703 waiting on condition [0x0000000106116000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
	at java.lang.Thread.sleep(Native Method)
	at com.journaldev.threads.MyTimerTask.main(MyTimerTask.java:33)

"VM Thread" prio=5 tid=0x00007fb7d480f000 nid=0x3d03 runnable 

"GC task thread#0 (ParallelGC)" prio=5 tid=0x00007fb7d500d800 nid=0x3503 runnable 

"GC task thread#1 (ParallelGC)" prio=5 tid=0x00007fb7d500e000 nid=0x3603 runnable 

"GC task thread#2 (ParallelGC)" prio=5 tid=0x00007fb7d5800000 nid=0x3703 runnable 

"GC task thread#3 (ParallelGC)" prio=5 tid=0x00007fb7d5801000 nid=0x3803 runnable 

"GC task thread#4 (ParallelGC)" prio=5 tid=0x00007fb7d5801800 nid=0x3903 runnable 

"GC task thread#5 (ParallelGC)" prio=5 tid=0x00007fb7d5802000 nid=0x3a03 runnable 

"GC task thread#6 (ParallelGC)" prio=5 tid=0x00007fb7d5802800 nid=0x3b03 runnable 

"GC task thread#7 (ParallelGC)" prio=5 tid=0x00007fb7d5803800 nid=0x3c03 runnable 

"VM Periodic Task Thread" prio=5 tid=0x00007fb7d481e800 nid=0x5403 waiting on condition 

JNI global references: 116

Thread dump is the list of all the threads, every entry shows information about thread which includes following in the order of appearance.

  1. Thread Name: Name of the Thread
  2. Thread Priority: Priority of the thread
  3. Thread ID: Represents the unique ID of the Thread
  4. Thread Status: Provides the current thread state, for example RUNNABLE, WAITING, BLOCKED. While analyzing deadlock look for the blocked threads and resources on which they are trying to acquire lock.
  5. Thread callstack: Provides the vital stack information for the thread. This is the place where we can see the locks obtained by Thread and if it’s waiting for any lock.

That’s all for thread dump in java.

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about our products

About the authors
Default avatar
Pankaj

author

While we believe that this content benefits our community, we have not yet thoroughly reviewed it. If you have any suggestions for improvements, please let us know by clicking the “report an issue“ button at the bottom of the tutorial.

Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
JournalDev
DigitalOcean Employee
DigitalOcean Employee badge
June 18, 2020

I want to get threads of application that is running in server it uses Java melody tool for monitoring. How can I get that I have tried this code but it is giving only system threads but not server threads: package checking; import java.lang.management.ManagementFactory; import java.lang.management.ThreadInfo; import java.lang.management.ThreadMXBean; public class Check{ public static void main(String[] args) { Check obj = new Check(); obj. crunchifyGenerate(); } public static void crunchifyGenerate () { ThreadInfo[] threadInfos = ManagementFactory.getThreadMXBean() .dumpAllThreads(true, true); StringBuilder dump = new StringBuilder(); dump.append(String.format(“%n”)); for (ThreadInfo threadInfo : threadInfos) { dump.append(threadInfo); } System.out.println(dump.toString()); } } Can you please me with this query

- Divya

    JournalDev
    DigitalOcean Employee
    DigitalOcean Employee badge
    December 12, 2019

    I got what you intend, thanks for posting .Woh I am thankful to find this website through google. “Wisdom doesn’t necessarily come with age. Sometimes age just shows up by itself.” by Woodrow Wilson.

    - activate nbc

      JournalDev
      DigitalOcean Employee
      DigitalOcean Employee badge
      July 13, 2018

      Thanks, it is helpful for java learners

      - Silent

        JournalDev
        DigitalOcean Employee
        DigitalOcean Employee badge
        April 22, 2018

        Thanks. Quite useful.

        - TanyA Nanda

          JournalDev
          DigitalOcean Employee
          DigitalOcean Employee badge
          July 18, 2016

          Great post !.. Thanks for sharing!..

          - stephen

            JournalDev
            DigitalOcean Employee
            DigitalOcean Employee badge
            June 17, 2014

            Your articles are very useful and explained with lot of good information.Thanks Pankaj.

            - Arjun

              JournalDev
              DigitalOcean Employee
              DigitalOcean Employee badge
              February 20, 2014

              Many Thanks, Pankaj !!!

              - Vinit G

                JournalDev
                DigitalOcean Employee
                DigitalOcean Employee badge
                August 30, 2013

                very nice tutorial well explained about Threads…Thank you very much…

                - sandeep kumar G

                  JournalDev
                  DigitalOcean Employee
                  DigitalOcean Employee badge
                  August 16, 2013

                  Thank you for the good writeup. It in fact was a amusement account it. Look advanced to more added agreeable from you! However, how could we communicate?

                  - Torsten

                    JournalDev
                    DigitalOcean Employee
                    DigitalOcean Employee badge
                    August 4, 2013

                    Hi, i read your blog occasionally and i own a similar one and i was just curious if you get a lot of spam comments? If so how do you prevent it, any plugin or anything you can suggest? I get so much lately it’s driving me crazy so any assistance is very much appreciated.

                    - Glue Pot

                      Try DigitalOcean for free

                      Click below to sign up and get $200 of credit to try our products over 60 days!

                      Sign up

                      Join the Tech Talk
                      Success! Thank you! Please check your email for further details.

                      Please complete your information!

                      Featured on Community

                      Get our biweekly newsletter

                      Sign up for Infrastructure as a Newsletter.

                      Hollie's Hub for Good

                      Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.

                      Become a contributor

                      Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

                      Welcome to the developer cloud

                      DigitalOcean makes it simple to launch in the cloud and scale up as you grow — whether you're running one virtual machine or ten thousand.

                      Learn more