Example code:
Public classCpulocktest {Private StaticObject Lock1 =NewObject (); Private StaticObject Lock2 =NewObject (); Public Static voidMain (string[] args) {NewThread ((){ synchronized(lock1) {Try{System.out.println (Thread.CurrentThread (). GetName ()+ "Get Lock1"); Thread.Sleep (3000L); } Catch(interruptedexception e) {e.printstacktrace (); } synchronized(Lock2) {System.out.println (Thread.CurrentThread (). GetName ()+ "Get Lock2"); } } },"Thread 1"). Start (); NewThread ((){ synchronized(lock2) {Try{System.out.println (Thread.CurrentThread (). GetName ()+ "Get Lock2"); Thread.Sleep (3000L); } Catch(interruptedexception e) {e.printstacktrace (); } synchronized(lock1) {System.out.println (Thread.CurrentThread (). GetName ()+ "Get Lock1"); } } },"Thread 2"). Start (); }}
Find out the PID (process ID)
Top command
In a Linux environment, you can view CPU usage for each process by using the top command, sorted by CPU usage by default
JPS command
Displays all the hotspot virtual machine processes within the specified system.
Thread condition viewed through process ID
Linux: Through TOP-HP 4548 can see the process under the CPU usage of each thread, the PID of the Wired path;
Mac:
Jstack View the status of the current process
? ~ Jstack 4548 2017-03-14 09:57:31full thread dump Java HotSpot (TM) 64-bit Server VM (25.102-b14 mixed mode): "Attach Listener "#13 daemon prio=9 os_prio=31 tid=0x00007f8c1a222000 nid=0x350f waiting on condition [0x0000000000000000] java. Lang. Thread.State:RUNNABLE "DESTROYJAVAVM" #12 prio=5 os_prio=31 tid=0x00007f8c1a26c800 nid=0x1703 waiting on condition [ 0X0000000000000000] Java.lang.Thread.State:RUNNABLE "Thread 2" #11 prio=5 os_prio=31 tid=0x00007f8c1a223000 nid=< c2>0x5103 waiting for monitor entry [0x000070000134f000] java.lang.Thread.State: BLOCKED (on object Monito R) at Cn.gov.zcy.fixed.cpulocktest.lambda$main$1 (cpulocktest.java:35) – Waiting to lock<0x0000000795b08d58>(a java.lang.Object)-locked<0x0000000795b08d68>(a java.lang.Object) at cn.gov.zcy.fixed.cpulocktest$ $Lambda $2/859417998.run (Unknown Source) at Java.lang.Threa D.run (thread.java:745) "Thread 1" #10 prio=5 os_prio=31 tid=0x00007f8c19967800 nid=0x4f03 waiting for monitor entry [ 0X000070000124C000] Java.lang.Thread.State: BLOCKED (on object monitor) at Cn.gov.zcy.fixed.CPULockTest.lamb Da$main$0 (cpulocktest.java:21)-Waiting to lock<0x0000000795b08d68>(a java.lang.Object)-locked<0x0000000795b08d58> (a java.lang.Object) at cn.gov.zcy.fixed.cpulocktest$ $Lambda $1/1020391880.run (Unknown Source) at JAVA.LANG.THREAD.R Un (thread.java:745) "Monitor ctrl-break" #9 daemon prio=5 os_prio=31 tid=0x00007f8c1a224800 nid=0x4d03 runnable [ 0X0000700001149000] Java.lang.Thread.State:RUNNABLE at java.net.PlainSocketImpl.socketAccept (Native Method) at Ja Va.net.AbstractPlainSocketImpl.accept (abstractplainsocketimpl.java:409) at Java.net.ServerSocket.implAccept ( serversocket.java:545) at Java.net.ServerSocket.accept (serversocket.java:513) at Com.intellij.rt.execution.application.appmain$1.run (appmain.java:90) at Java.lang.Thread.run (thread.java:745) " Service Thread "#8 daemon prio=9 os_prio=31 tid=0x00007f8c1a029800 nid=0x4903 runnable [0x0000000000000000] Java.lang.Th Read. State:runnable "C1 CompilerThread2" #7 daemon prio=9 os_prio=31 tid=0x00007f8c1a83f800 nid=0x4703 waiting on condition [0x 0000000000000000] Java.lang.Thread.State:RUNNABLE "C2 CompilerThread1" #6 Daemon PRio=9 os_prio=31 tid=0x00007f8c19845000 nid=0x4503 waiting on condition [0x0000000000000000] Java.lang.Thread.State:RU Nnable "C2 CompilerThread0" #5 daemon prio=9 os_prio=31 tid=0x00007f8c1a800800 nid=0x4303 waiting on condition [0x00000000 00000000] Java.lang.Thread.State:RUNNABLE "Signal Dispatcher" #4 daemon prio=9 os_prio=31 tid=0x00007f8c1a028000 nid=0x 320f runnable [0x0000000000000000] Java.lang.Thread.State:RUNNABLE "Finalizer" #3 daemon prio=8 os_prio=31 tid=0x00007f 8c1a82d000 nid=0x3003 in Object.wait () [0x000070000092e000] Java.lang.Thread.State:WAITING (on Object monitor) at Ja Va.lang.Object.wait (Native Method)-waiting on<0x0000000795588e98> (a java.lang.ref.referencequeue$lock) at Java.lang.ref.ReferenceQueue.remove (referencequeue.java:143 )- locked <0x0000000795588e98> (a java.lang.ref.referencequeue$lock) at Java.lang.ref.ReferenceQueue.remove (referencequeue.java:164 ) at Java.lang.ref.finalizer$finalizerthread.run (finalizer.java:209) "Reference Handler" #2 daemon prio=10 os_prio=31 t id=0x00007f8c19805000 nid=0x2e03 in Object.wait () [0x000070000082b000] Java.lang.Thread.State:WAITING (on Object monit OR) at java.lang.Object.wait (Native Method) – waiting on<0x0000000795586b40> (a java.lang.ref.reference$lock) at java.lang.Object.wait (object.java:502) at java.lang.ref.Reference. Tryhandlepending (reference.java:191)- locked <0x0000000795586b40>(a java.lang.ref.reference$lock) At Java.lang.ref.reference$referencehandler.run (reference.java:153) "VM Thread" os_prio=31 tid=0x00007f8c1a014000 NID=0X2C03 runnable "GC task thread#0 (PARALLELGC)" os_prio=31 tid=0x00007f8c1a818800 nid=0x2403 runnable "GC Task thread# 1 (PARALLELGC) "os_prio=31 tid=0x00007f8c1a000800 nid=0x2603 runnable" GC task thread#2 (PARALLELGC) "Os_prio=31 tid=0x00 007f8c19809000 nid=0x2803 runnable "GC task thread#3 (PARALLELGC)" Os_prio=31 tid=0x00007f8c19809800 nid=0x2a03 runnable "VM periodic Task Thread" os_prio=31 tid=0x00007f8c1b029800 nid=0x4b03 waiting on condition JNI global References:324foun D one java-level deadlock:============================= "Thread 2": Waiting to lock monitor 0x00007f8c1a0176b8 (object 0x00000 00795B08D58, a java.lang.Object), which is held by "Thread 1" "Thread 1": Waiting to lock monitor 0x00007f8c1a0178c8 (Object 0x0000 000795b08d68, a java.lang.Object), which is held by "Thread 2" Java stack information for the threads listed above:============ ======================================= "Thread 2": at Cn.gov.zcy.fixed.cpulocktest.lambda$main$1 (cpulocktest.java:35) – Waiting to lock <0x0000000795b08d58>(a java.lang.Object)-locked<0x0000000795b08d68>(a java.lang.Object) at cn.gov.zcy.fixed.cpulocktest$ $Lambda $2/859417998.run (Unknown Source) at Java.lang.Threa D.run (thread.java:745) "Thread 1": At Cn.gov.zcy.fixed.cpulocktest.lambda$main$0 (cpulocktest.java:21) – Waiting to lock
<0x0000000795b08d68>(a java.lang.Object)-locked<0x0000000795b08d58>(a java.lang.Object) at cn.gov.zcy.fixed.cpulocktest$ $Lambda $1/1020391880.run (Unknown Source) at Java.lang.Thre Ad.run (thread.java:745) Found 1 deadlock.
The thread dump information generated by the Jstack command contains all the surviving threads in the JVM, and in order to parse the specified thread, the call stack for the corresponding thread must be found.
In the top command, a thread PID with a higher CPU resource is obtained, the PID is turned into a 16-binary value, and each thread in thread dump has a nid to find the corresponding nid Interval time to execute the stack command to get thread dump, to distinguish between two dump dumps.
Analyze thread state from CPU load to Jstack