In this article, we will show you:
- How to generate thread dumps on different VMs
- What to know about thread states
JVM Thread States
A thread can be in only one state at a given point in time. These states are virtual machine states which do not reflect any operating system thread states. As an example, here shows different threads in different states on a HotSpot VM:
$ cat thread.tmp | grep "java.lang.Thread.State" | sort | uniq -c
3 java.lang.Thread.State: BLOCKED (on object monitor)
18 java.lang.Thread.State: RUNNABLE
6 java.lang.Thread.State: TIMED_WAITING (on object monitor)
2 java.lang.Thread.State: TIMED_WAITING (sleeping)
13 java.lang.Thread.State: WAITING (on object monitor)
3 java.lang.Thread.State: WAITING (parking)
Below we describe some of the thread states that can be found in a thread dump:
where 15679 is the process ID. For example, it will print the following messages:
$ cat thread.tmp | grep "java.lang.Thread.State" | sort | uniq -c
3 java.lang.Thread.State: BLOCKED (on object monitor)
18 java.lang.Thread.State: RUNNABLE
6 java.lang.Thread.State: TIMED_WAITING (on object monitor)
2 java.lang.Thread.State: TIMED_WAITING (sleeping)
13 java.lang.Thread.State: WAITING (on object monitor)
3 java.lang.Thread.State: WAITING (parking)
Below we describe some of the thread states that can be found in a thread dump:
- NEW - this state represents a new thread which is not yet started.
- RUNNABLE - this state represents a thread which is executing in the underlying JVM. Here executing in JVM doesn't mean that the thread is always executing in the OS as well - it may wait for a resource from the Operating system like the processor while being in this state.
- BLOCKED (on object monitor)- this state represents a thread which has been blocked and is waiting for a moniotor to enter/re-enter a synchronized block/method. A thread gets into this state after calling Object.wait method.
- WAITING - this state represnts a thread in the waiting state and this wait is over only when some other thread performs some appropriate action. A thread can get into this state either by calling - Object.wait (without timeout), Thread.join (without timeout), or LockSupport.park methods.
- TIMED_WAITING - this state represents a thread which is required to wait at max for a specified time limit. A thread can get into this state by calling either of these methods: Thread.sleep, Object.wait (with timeout specified), Thread.join (with timeout specified), LockSupport.parkNanos, LockSupport.parkUntil
- TERMINATED - this state reprents a thread which has completed its execution either by returning from the run() method after completing the execution OR by throwing an exception which propagated from the run() method and hence caused the termination of the thread.
- WAITING (parking)- it means a wait state after being parked. A thread can suspend its execution until permit is available (or thread is interrupted, or timeout expired, etc) by calling park(). You can give permit to a thread by calling unpark(). When permit is available, the parked thread consumes it and exits a park() method. Unlike Semaphore's permits, permits of LockSupport are associated with threads (i.e. permit is given to a particular thread) and doesn't accumulate (i.e. there can be only one permit per thread, when thread consumes the permit, it disappears).
- It's hard to investigate any CPU issue just from one thread dump. So, you need to prepare a series of thread dumps for investigation. For an example of analyzing hanging problems, see [9].
- The above thread state information is for HotSpot. To understand JRockit's thread dump contents, read [4].
Generating Thread Dumps in HotSpot
$jcmd 15679 Thread.print >thread.tmp
where 15679 is the process ID. For example, it will print the following messages:
15679: 2012-08-24 11:27:27 Full thread dump Java HotSpot(TM) 64-Bit Server VM (23.0-b21-internal mixed mode): "Attach Listener" daemon prio=10 tid=0x000000000528e000 nid=0x4653 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE "Thread-29" daemon prio=10 tid=0x00002aaab9447000 nid=0x3fe3 runnable [0x000000004408b000] java.lang.Thread.State: RUNNABLE at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:150) at java.net.SocketInputStream.read(SocketInputStream.java:121) at java.io.BufferedInputStream.fill(BufferedInputStream.java:235) at java.io.BufferedInputStream.read1(BufferedInputStream.java:275) at java.io.BufferedInputStream.read(BufferedInputStream.java:334) - locked <0x00000000f5ae4738> (a java.io.BufferedInputStream) at com.sun.jndi.ldap.Connection.run(Connection.java:849) at java.lang.Thread.run(Thread.java:722)0x00000000f5ae4738>
Generating Thread Dumps in JRockit[4]
$jrcmd 1286 print_threadswhere 1286 is the process ID. For example, it will print the following messages:
1286: ===== FULL THREAD DUMP =============== Thu Aug 23 17:36:30 2012 Oracle JRockit(R) R28.1.3-11-141760-1.6.0_24-20110301-1432-linux-x86_64 "Main Thread" id=1 idx=0x4 tid=1287 prio=5 alive, waiting, native_blocked -- Waiting for notification on: weblogic/t3/srvr/T3Srvr@0xe48b4598[fat lock] at jrockit/vm/Threads.waitForNotifySignal(JLjava/lang/Object;)Z(Native Method) at java/lang/Object.wait(J)V(Native Method) at java/lang/Object.wait(Object.java:485) at weblogic/t3/srvr/T3Srvr.waitForDeath(T3Srvr.java:981) ^-- Lock released while waiting: weblogic/t3/srvr/T3Srvr@0xe48b4598[fat lock] at weblogic/t3/srvr/T3Srvr.run(T3Srvr.java:490) at weblogic/Server.main(Server.java:71) at jrockit/vm/RNI.c2java(JJJJJ)V(Native Method) -- end of trace "(Signal Handler)" id=2 idx=0x8 tid=1288 prio=5 alive, native_blocked, daemon "(OC Main Thread)" id=3 idx=0xc tid=1289 prio=5 alive, native_waiting, daemon ...
References
- Understanding Threads and Locks
- Thread States Diagram
- Useful tool: jrcmd
- Using Thread Dumps
- Understanding a Java thread dump
- Fun with JStack
- Java 2 Platform, Standard Edition 5.0 "Trouobingshooting and Diagnostic Guide"
- HotSpot VM Performance Tuning Tips
- Analyze Hanging Programs Using Java Thread Traces (XML and More)
- Analyzing Thread Dumps in Middleware - Part 1
- Analyzing Thread Dumps in Middleware - Part 2
7 comments:
about State.BLOCKED, you say "A thread gets into this state after calling Object.wait method.",but that's not true.
data science training in chennai Data Science Training in Chennai with real time projects. We are Best Data Science Training Institute in Chennai. Our Data Science training courses are taught by Experts.
Very nice post. thanks for sharing with us.
aws Training in Bangalore
python Training in Bangalore
hadoop Training in Bangalore
angular js Training in Bangalore
bigdata analytics Training in Bangalore
python Training in Bangalore
aws Training in Bangalore
Great Blog to read,Its gives more useful information.Thank lot.
data science training institute in bangalore
Data Science certification course in Bangalore
Thanks for Sharing a Very Informative Post & I read Your Article & I must say that is a very helpful post for us.
Online Data Science Classes
Selenium Training in Pune
AWS Online Classes
Python Online Classes
very informative and interesting article.thanks for sharing.Angular training in Chennai
class 10 tution classes in gurgaon
Post a Comment