性能分析3~jstack命令分析:死锁原因、cpu使用率过高的线程

jstack主要用来查看某个Java进程内的线程堆栈信息。根据这个命令的输出可以定位某个进程的所有线程的当前运行状态、运行代码,以及是否死锁等等。

语法格式如下:

jstack [option] pid
jstack [option] executable core
jstack [option] [server-id@]remote-hostname-or-ip

    命令行参数选项说明如下:

-l long listings,会打印出额外的锁信息,在发生死锁时可以用jstack -l pid来观察锁持有情况
-m mixed mode,不仅会输出Java堆栈信息,还会输出C/C++堆栈信息(比如Native方法)

    jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。

老规矩,我们来一个实例找出某个Java进程中产生死锁的Java线程并定位堆栈信息,文章末尾给出了一个产生死锁的例子:

    第一步先找出Java进程ID,在我的例子中id=23600

    第二步使用stack -l pid命令查询堆栈信息,如下:

zhengchao1991deMacBook-Pro:~ zhengchao1991$ jstack -l 23600
2017-08-23 16:47:40
Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.79-b02 mixed mode):

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

   Locked ownable synchronizers:
	- None

"DestroyJavaVM" prio=5 tid=0x00007fd590800000 nid=0x1c03 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
	- None

"Thread-1" prio=5 tid=0x00007fd59083d800 nid=0x5503 waiting for monitor entry [0x000070000c507000]
   java.lang.Thread.State: BLOCKED (on object monitor)
	at deadlock.DeadlockSample.calLock_Obj2_First(DeadlockSample.java:44)
	- waiting to lock <0x00000007aaaddcb8> (a java.lang.Object)
	- locked <0x00000007aaaddcc8> (a java.lang.Object)
	at deadlock.DeadlockSample.access$1(DeadlockSample.java:40)
	at deadlock.DeadlockSample$2.run(DeadlockSample.java:22)
	at java.lang.Thread.run(Thread.java:745)

   Locked ownable synchronizers:
	- None

"Thread-0" prio=5 tid=0x00007fd59083d000 nid=0x5303 waiting for monitor entry [0x000070000c404000]
   java.lang.Thread.State: BLOCKED (on object monitor)
	at deadlock.DeadlockSample.calLock_Obj1_First(DeadlockSample.java:34)
	- waiting to lock <0x00000007aaaddcc8> (a java.lang.Object)
	- locked <0x00000007aaaddcb8> (a java.lang.Object)
	at deadlock.DeadlockSample.access$0(DeadlockSample.java:30)
	at deadlock.DeadlockSample$1.run(DeadlockSample.java:17)
	at java.lang.Thread.run(Thread.java:745)

   Locked ownable synchronizers:
	- None

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

   Locked ownable synchronizers:
	- None

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

   Locked ownable synchronizers:
	- None

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

   Locked ownable synchronizers:
	- None

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

   Locked ownable synchronizers:
	- None

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

   Locked ownable synchronizers:
	- None

"Reference Handler" daemon prio=5 tid=0x00007fd593004800 nid=0x3703 in Object.wait() [0x000070000bcef000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x00000007aaa84470> (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 <0x00000007aaa84470> (a java.lang.ref.Reference$Lock)

   Locked ownable synchronizers:
	- None

"VM Thread" prio=5 tid=0x00007fd592807000 nid=0x3503 runnable 

"GC task thread#0 (ParallelGC)" prio=5 tid=0x00007fd591006000 nid=0x2503 runnable 

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

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

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

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

"GC task thread#5 (ParallelGC)" prio=5 tid=0x00007fd592800800 nid=0x2f03 runnable 

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

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

"VM Periodic Task Thread" prio=5 tid=0x00007fd590809800 nid=0x5103 waiting on condition 

JNI global references: 108


Found one Java-level deadlock:
=============================
"Thread-1":
  waiting to lock monitor 0x00007fd590818b58 (object 0x00000007aaaddcb8, a java.lang.Object),
  which is held by "Thread-0"
"Thread-0":
  waiting to lock monitor 0x00007fd590817768 (object 0x00000007aaaddcc8, a java.lang.Object),
  which is held by "Thread-1"

Java stack information for the threads listed above:
===================================================
"Thread-1":
	at deadlock.DeadlockSample.calLock_Obj2_First(DeadlockSample.java:44)
	- waiting to lock <0x00000007aaaddcb8> (a java.lang.Object)
	- locked <0x00000007aaaddcc8> (a java.lang.Object)
	at deadlock.DeadlockSample.access$1(DeadlockSample.java:40)
	at deadlock.DeadlockSample$2.run(DeadlockSample.java:22)
	at java.lang.Thread.run(Thread.java:745)
"Thread-0":
	at deadlock.DeadlockSample.calLock_Obj1_First(DeadlockSample.java:34)
	- waiting to lock <0x00000007aaaddcc8> (a java.lang.Object)
	- locked <0x00000007aaaddcb8> (a java.lang.Object)
	at deadlock.DeadlockSample.access$0(DeadlockSample.java:30)
	at deadlock.DeadlockSample$1.run(DeadlockSample.java:17)
	at java.lang.Thread.run(Thread.java:745)

Found 1 deadlock.
第三步根据堆栈信息,找到具体定位到出现死锁的代码段:

"Thread-1":
	at deadlock.DeadlockSample.calLock_Obj2_First(DeadlockSample.java:44)
	
"Thread-0":
	at deadlock.DeadlockSample.calLock_Obj1_First(DeadlockSample.java:34)

根据代码段我们看出,两个线程执行过程中,需要对两个对象进行加锁,且加锁的顺序不一致,导致了死锁的产生,简单的修复方法是:对两个对象的加锁顺序一致。



死锁程序:

package deadlock;

public class DeadlockSample {
	
	//必须有两个可以被加锁的对象才能产生死锁,只有一个不会产生死锁问题
    private final Object obj1 = new Object();
    private final Object obj2 = new Object();
 
    public static void main(String[] args) {
        DeadlockSample test = new DeadlockSample();
        test.testDeadlock();
    }
 
    private void testDeadlock() {
        Thread t1 = new Thread(new Runnable() {
            public void run() {
                calLock_Obj1_First();
            }
        });
        Thread t2 = new Thread(new Runnable() {
            public void run() {
            	calLock_Obj2_First();
            }
        });
        t1.start();
        t2.start();
    }
    
    //先synchronized  obj1,再synchronized  obj2
    private void calLock_Obj1_First() {
        synchronized (obj1) {
            sleep();
            synchronized (obj2) {
                sleep();
            }
        }
    }
    
  //先synchronized  obj2,再synchronized  obj1
    private void calLock_Obj2_First() {
        synchronized (obj2) {
            sleep();
            synchronized (obj1) {
                sleep();
            }
        }
    }
    
    /**
     * 为了便于让两个线程分别锁住其中一个对象,
     * 一个线程锁住obj1,然后一直等待obj2,
     * 另一个线程锁住obj2,然后一直等待obj1,
     * 然后就是一直等待,死锁产生
     */
    private void sleep() {
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

我们再来分析cpu使用率过高的线程定位:

先给出容易导致cpu使用率过高的代码:

public static void main(String[] args){
	for(int i=0;i<10000;i++){
		try {
			Thread.sleep(100);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		new Thread().run();
	}
}

我们使用如下命令找出cpu占用率最高的进程:

top -o cpu
这里找到的进程id为: 19426

使用jstack命令打印进程的详细信息,里面会包含他所有的线程信息

jstack 19426
输出:

zhengchao1991deMacBook-Pro:~ zhengchao1991$ jstack 16876
2017-08-23 17:15:00
Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.79-b02 mixed mode):

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

"Process monitor" daemon prio=5 tid=0x0000000100dc0800 nid=0x1d023 in Object.wait() [0x000070000f3a4000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at java.lang.Object.wait(Object.java:503)
	at java.lang.UNIXProcess.waitFor(UNIXProcess.java:261)
	- locked <0x00000007f8a4e1a0> (a java.lang.UNIXProcess)
	at org.eclipse.debug.core.model.RuntimeProcess$ProcessMonitorThread.run(RuntimeProcess.java:426)

"Input Stream Monitor" daemon prio=5 tid=0x0000000101c05800 nid=0x1d18b in Object.wait() [0x000070000f11b000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at java.lang.Object.wait(Object.java:503)
	at org.eclipse.debug.internal.core.InputStreamMonitor.writeNext(InputStreamMonitor.java:156)
	- locked <0x00000007f8a56b28> (a java.lang.Object)
	at org.eclipse.debug.internal.core.InputStreamMonitor.write(InputStreamMonitor.java:125)
	at org.eclipse.debug.internal.core.InputStreamMonitor$1.run(InputStreamMonitor.java:100)
	at java.lang.Thread.run(Thread.java:745)

"Output Stream Monitor" daemon prio=5 tid=0x0000000100f0c000 nid=0x1cac3 runnable [0x000070000ee12000]
   java.lang.Thread.State: RUNNABLE
	at java.io.FileInputStream.readBytes(Native Method)
	at java.io.FileInputStream.read(FileInputStream.java:272)
	at java.io.BufferedInputStream.read1(BufferedInputStream.java:273)
	at java.io.BufferedInputStream.read(BufferedInputStream.java:334)
	- locked <0x00000007f8a526b8> (a java.lang.UNIXProcess$ProcessPipeInputStream)
	at java.io.BufferedInputStream.read1(BufferedInputStream.java:273)
	at java.io.BufferedInputStream.read(BufferedInputStream.java:334)
	- locked <0x00000007f8a56a38> (a java.io.BufferedInputStream)
	at java.io.FilterInputStream.read(FilterInputStream.java:107)
	at org.eclipse.debug.internal.core.OutputStreamMonitor.read(OutputStreamMonitor.java:147)
	at org.eclipse.debug.internal.core.OutputStreamMonitor.access$1(OutputStreamMonitor.java:137)
	at org.eclipse.debug.internal.core.OutputStreamMonitor$1.run(OutputStreamMonitor.java:212)
	at java.lang.Thread.run(Thread.java:745)

"Output Stream Monitor" daemon prio=5 tid=0x000000012604b000 nid=0x17b5f runnable [0x000070000e4ee000]
   java.lang.Thread.State: RUNNABLE
	at java.io.FileInputStream.readBytes(Native Method)
	at java.io.FileInputStream.read(FileInputStream.java:272)
	at java.io.BufferedInputStream.read1(BufferedInputStream.java:273)
	at java.io.BufferedInputStream.read(BufferedInputStream.java:334)
	- locked <0x00000007f8a505f0> (a java.lang.UNIXProcess$ProcessPipeInputStream)
	at java.io.BufferedInputStream.read1(BufferedInputStream.java:273)
	at java.io.BufferedInputStream.read(BufferedInputStream.java:334)
	- locked <0x00000007f8a56980> (a java.io.BufferedInputStream)
	at java.io.FilterInputStream.read(FilterInputStream.java:107)
	at org.eclipse.debug.internal.core.OutputStreamMonitor.read(OutputStreamMonitor.java:147)
	at org.eclipse.debug.internal.core.OutputStreamMonitor.access$1(OutputStreamMonitor.java:137)
	at org.eclipse.debug.internal.core.OutputStreamMonitor$1.run(OutputStreamMonitor.java:212)
	at java.lang.Thread.run(Thread.java:745)

"process reaper" daemon prio=5 tid=0x0000000126382800 nid=0x1c513 runnable [0x000070000de04000]
   java.lang.Thread.State: RUNNABLE
	at java.lang.UNIXProcess.waitForProcessExit(Native Method)
	at java.lang.UNIXProcess.access$500(UNIXProcess.java:54)
	at java.lang.UNIXProcess$4.run(UNIXProcess.java:225)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:745)

"org.eclipse.wst.sse.ui.internal.reconcile.StructuredRegionProcessor" daemon prio=5 tid=0x000000011b5d8000 nid=0x1bc83 in Object.wait() [0x000070000e6f7000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at org.eclipse.wst.sse.ui.internal.reconcile.DirtyRegionProcessor$BackgroundThread.run(DirtyRegionProcessor.java:667)
	- locked <0x00000007e686e9b0> (a java.util.Collections$SynchronizedRandomAccessList)

"org.eclipse.jdt.internal.ui.text.JavaReconciler" daemon prio=5 tid=0x0000000103236800 nid=0x18523 in Object.wait() [0x000070000ef15000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at org.eclipse.jface.text.reconciler.AbstractReconciler$BackgroundThread.run(AbstractReconciler.java:179)
	- locked <0x00000007e6307ab0> (a org.eclipse.jface.text.reconciler.DirtyRegionQueue)

"Worker-28" prio=5 tid=0x000000011b2e4000 nid=0x13b63 in Object.wait() [0x000070000f018000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at org.eclipse.core.internal.jobs.WorkerPool.sleep(WorkerPool.java:188)
	- locked <0x00000007e11f0520> (a org.eclipse.core.internal.jobs.WorkerPool)
	at org.eclipse.core.internal.jobs.WorkerPool.startJob(WorkerPool.java:220)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:51)

"org.eclipse.jdt.internal.ui.text.JavaReconciler" daemon prio=5 tid=0x0000000100b99800 nid=0x120c3 in Object.wait() [0x000070000ed0f000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at org.eclipse.jface.text.reconciler.AbstractReconciler$BackgroundThread.run(AbstractReconciler.java:179)
	- locked <0x00000007e5dc3db0> (a org.eclipse.jface.text.reconciler.DirtyRegionQueue)

"org.eclipse.jdt.internal.ui.text.JavaReconciler" daemon prio=5 tid=0x00000001010f5800 nid=0x1af13 in Object.wait() [0x000070000f2a1000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at org.eclipse.jface.text.reconciler.AbstractReconciler$BackgroundThread.run(AbstractReconciler.java:179)
	- locked <0x00000007e5c73ff8> (a org.eclipse.jface.text.reconciler.DirtyRegionQueue)

"Worker-27" prio=5 tid=0x000000011ac29000 nid=0x18c6b in Object.wait() [0x000070000ec0c000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at org.eclipse.core.internal.jobs.WorkerPool.sleep(WorkerPool.java:188)
	- locked <0x00000007e11f0520> (a org.eclipse.core.internal.jobs.WorkerPool)
	at org.eclipse.core.internal.jobs.WorkerPool.startJob(WorkerPool.java:220)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:51)

"Worker-26" prio=5 tid=0x0000000100c34800 nid=0x19627 in Object.wait() [0x000070000e87a000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at java.lang.Object.wait(Object.java:503)
	at org.eclipse.ui.console.IOConsoleInputStream.waitForData(IOConsoleInputStream.java:150)
	at org.eclipse.ui.console.IOConsoleInputStream.read(IOConsoleInputStream.java:93)
	- locked <0x00000007f8a9e7a0> (a org.eclipse.ui.console.IOConsoleInputStream)
	at org.eclipse.ui.console.IOConsoleInputStream.read(IOConsoleInputStream.java:119)
	at org.eclipse.debug.internal.ui.views.console.ProcessConsole$InputReadJob.run(ProcessConsole.java:700)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)

"Worker-25" prio=5 tid=0x00000001014a6800 nid=0x16763 in Object.wait() [0x000070000e165000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at org.eclipse.core.internal.jobs.WorkerPool.sleep(WorkerPool.java:188)
	- locked <0x00000007e11f0520> (a org.eclipse.core.internal.jobs.WorkerPool)
	at org.eclipse.core.internal.jobs.WorkerPool.startJob(WorkerPool.java:220)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:51)

"Worker-24" prio=5 tid=0x000000010090d000 nid=0x130bb in Object.wait() [0x000070000dcd3000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at org.eclipse.core.internal.jobs.WorkerPool.sleep(WorkerPool.java:188)
	- locked <0x00000007e11f0520> (a org.eclipse.core.internal.jobs.WorkerPool)
	at org.eclipse.core.internal.jobs.WorkerPool.startJob(WorkerPool.java:220)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:51)

"Worker-23" prio=5 tid=0x000000012947b800 nid=0x1589f in Object.wait() [0x000070000d9c7000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at org.eclipse.core.internal.jobs.WorkerPool.sleep(WorkerPool.java:188)
	- locked <0x00000007e11f0520> (a org.eclipse.core.internal.jobs.WorkerPool)
	at org.eclipse.core.internal.jobs.WorkerPool.startJob(WorkerPool.java:220)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:51)

"Worker-17" prio=5 tid=0x0000000100baf800 nid=0x17aa7 in Object.wait() [0x000070000d3b2000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at org.eclipse.core.internal.jobs.WorkerPool.sleep(WorkerPool.java:188)
	- locked <0x00000007e11f0520> (a org.eclipse.core.internal.jobs.WorkerPool)
	at org.eclipse.core.internal.jobs.WorkerPool.startJob(WorkerPool.java:220)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:51)

"Worker-12" prio=5 tid=0x000000011acf8800 nid=0x119bb in Object.wait() [0x000070000b9db000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at org.eclipse.core.internal.jobs.WorkerPool.sleep(WorkerPool.java:188)
	- locked <0x00000007e11f0520> (a org.eclipse.core.internal.jobs.WorkerPool)
	at org.eclipse.core.internal.jobs.WorkerPool.startJob(WorkerPool.java:220)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:51)

"Worker-9" prio=5 tid=0x0000000122862800 nid=0x14353 in Object.wait() [0x000070000e2e8000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at org.eclipse.core.internal.jobs.WorkerPool.sleep(WorkerPool.java:188)
	- locked <0x00000007e11f0520> (a org.eclipse.core.internal.jobs.WorkerPool)
	at org.eclipse.core.internal.jobs.WorkerPool.startJob(WorkerPool.java:220)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:51)

"Worker-8" prio=5 tid=0x000000011b48a000 nid=0xcf6f in Object.wait() [0x000070000daca000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at org.eclipse.core.internal.jobs.WorkerPool.sleep(WorkerPool.java:188)
	- locked <0x00000007e11f0520> (a org.eclipse.core.internal.jobs.WorkerPool)
	at org.eclipse.core.internal.jobs.WorkerPool.startJob(WorkerPool.java:220)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:51)

"[ThreadPool Manager] - Idle Thread" daemon prio=5 tid=0x0000000126055800 nid=0x14603 in Object.wait() [0x000070000e3eb000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at java.lang.Object.wait(Object.java:503)
	at org.eclipse.equinox.internal.util.impl.tpt.threadpool.Executor.run(Executor.java:106)
	- locked <0x00000007e320bb20> (a org.eclipse.equinox.internal.util.impl.tpt.threadpool.Executor)

"JavaScript indexing" daemon prio=5 tid=0x000000010353f000 nid=0x1340f in Object.wait() [0x000070000dfdf000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x00000007e328bcb0> (a org.eclipse.wst.jsdt.internal.core.search.indexing.IndexManager)
	at java.lang.Object.wait(Object.java:503)
	at org.eclipse.wst.jsdt.internal.core.search.processing.JobManager.run(JobManager.java:370)
	- locked <0x00000007e328bcb0> (a org.eclipse.wst.jsdt.internal.core.search.indexing.IndexManager)
	at java.lang.Thread.run(Thread.java:745)

"EventAdmin Async Event Dispatcher Thread" daemon prio=5 tid=0x000000011ae44800 nid=0x106cf in Object.wait() [0x000070000d63b000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at java.lang.Object.wait(Object.java:503)
	at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.getNextEvent(EventManager.java:400)
	- locked <0x00000007e2176fc8> (a org.eclipse.osgi.framework.eventmgr.EventManager$EventThread)
	at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:336)

"Java indexing" daemon prio=5 tid=0x0000000100a81800 nid=0x1513 in Object.wait() [0x000070000d8c4000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at java.lang.Object.wait(Object.java:503)
	at org.eclipse.jdt.internal.core.search.processing.JobManager.run(JobManager.java:382)
	- locked <0x00000007e1f37000> (a org.eclipse.jdt.internal.core.search.indexing.IndexManager)
	at java.lang.Thread.run(Thread.java:745)

"Bundle File Closer" daemon prio=5 tid=0x000000011ae91000 nid=0xd633 in Object.wait() [0x000070000d7c1000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at java.lang.Object.wait(Object.java:503)
	at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.getNextEvent(EventManager.java:400)
	- locked <0x00000007e11ca830> (a org.eclipse.osgi.framework.eventmgr.EventManager$EventThread)
	at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:336)

"Worker-0" prio=5 tid=0x0000000100c71800 nid=0x9d4f in Object.wait() [0x000070000d0a9000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x00000007e533c330> (a org.eclipse.core.internal.jobs.Semaphore)
	at org.eclipse.core.internal.jobs.Semaphore.acquire(Semaphore.java:39)
	- locked <0x00000007e533c330> (a org.eclipse.core.internal.jobs.Semaphore)
	at org.eclipse.core.internal.jobs.OrderedLock.doAcquire(OrderedLock.java:179)
	at org.eclipse.core.internal.jobs.OrderedLock.acquire(OrderedLock.java:112)
	at org.eclipse.core.internal.jobs.OrderedLock.acquire(OrderedLock.java:85)
	at org.eclipse.jdt.internal.junit.ui.TestRunnerViewPart$JUnitIsRunningJob.run(TestRunnerViewPart.java:845)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)

"EMF Reference Cleaner" daemon prio=5 tid=0x0000000100ace000 nid=0xe207 in Object.wait() [0x000070000d4b5000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
	- locked <0x00000007e11b9048> (a java.lang.ref.ReferenceQueue$Lock)
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
	at org.eclipse.emf.common.util.CommonUtil$1ReferenceClearingQueuePollingThread.run(CommonUtil.java:70)

"Worker-JM" prio=5 tid=0x0000000100c67000 nid=0xde03 in Object.wait() [0x000070000d2af000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at org.eclipse.core.internal.jobs.InternalWorker.run(InternalWorker.java:59)
	- locked <0x00000007e17e0e28> (a java.util.ArrayList)

"[Timer] - Main Queue Handler" daemon prio=5 tid=0x0000000101892800 nid=0xd803 in Object.wait() [0x000070000d1ac000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at org.eclipse.equinox.internal.util.impl.tpt.timer.TimerImpl.run(TimerImpl.java:141)
	- locked <0x00000007e1519ec8> (a java.lang.Object)
	at java.lang.Thread.run(Thread.java:745)

"Start Level: Equinox Container: e0236bdf-9f87-0017-1387-e32e402bba31" daemon prio=5 tid=0x00000001019c6000 nid=0x1607 in Object.wait() [0x000070000cf23000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x00000007e11fe170> (a org.eclipse.osgi.framework.eventmgr.EventManager$EventThread)
	at java.lang.Object.wait(Object.java:503)
	at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.getNextEvent(EventManager.java:400)
	- locked <0x00000007e11fe170> (a org.eclipse.osgi.framework.eventmgr.EventManager$EventThread)
	at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:336)

"Framework Event Dispatcher: Equinox Container: e0236bdf-9f87-0017-1387-e32e402bba31" daemon prio=5 tid=0x000000010188e800 nid=0x8607 in Object.wait() [0x000070000ce20000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x00000007e1224118> (a org.eclipse.osgi.framework.eventmgr.EventManager$EventThread)
	at java.lang.Object.wait(Object.java:503)
	at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.getNextEvent(EventManager.java:400)
	- locked <0x00000007e1224118> (a org.eclipse.osgi.framework.eventmgr.EventManager$EventThread)
	at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:336)

"Active Thread: Equinox Container: e0236bdf-9f87-0017-1387-e32e402bba31" prio=5 tid=0x00000001009e1000 nid=0xb607 waiting on condition [0x000070000cd1d000]
   java.lang.Thread.State: TIMED_WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x00000007e0d5ff00> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:226)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2082)
	at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1090)
	at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:807)
	at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:745)

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

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

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

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

"Finalizer" daemon prio=5 tid=0x0000000103004000 nid=0x6903 in Object.wait() [0x000070000c605000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
	- locked <0x00000007e065f240> (a java.lang.ref.ReferenceQueue$Lock)
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
	at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)

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

"main" prio=5 tid=0x0000000100846800 nid=0x307 runnable [0x00007fff5fbfe000]
   java.lang.Thread.State: RUNNABLE
	at org.eclipse.swt.internal.cocoa.OS.objc_msgSend_bool(Native Method)
	at org.eclipse.swt.internal.cocoa.NSRunLoop.runMode(NSRunLoop.java:42)
	at org.eclipse.swt.widgets.Display.sleep(Display.java:4691)
	at org.eclipse.ui.application.WorkbenchAdvisor.eventLoopIdle(WorkbenchAdvisor.java:368)
	at org.eclipse.ui.internal.ide.application.IDEWorkbenchAdvisor.eventLoopIdle(IDEWorkbenchAdvisor.java:918)
	at org.eclipse.ui.internal.Workbench$3.eventLoopIdle(Workbench.java:498)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1155)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1032)
	at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:148)
	at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:636)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:579)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:135)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:380)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:235)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:648)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:603)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1465)

"VM Thread" prio=5 tid=0x0000000100895800 nid=0x6503 runnable 

"GC task thread#0 (ParallelGC)" prio=5 tid=0x0000000100855000 nid=0x5503 runnable 

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

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

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

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

"GC task thread#5 (ParallelGC)" prio=5 tid=0x0000000100858000 nid=0x5f03 runnable 

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

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

"VM Periodic Task Thread" prio=5 tid=0x000000010302a000 nid=0x7603 waiting on condition 

JNI global references: 2763

分析这些信息,我们就可以定位造成cpu占用过高的具体代码的位置,进而再深入分析原因,当然我们这里的代码没有太大的价值,只是产生了很多的线程,大量的线程在排队等待执行。









发布了142 篇原创文章 · 获赞 345 · 访问量 45万+

猜你喜欢

转载自blog.csdn.net/zhengchao1991/article/details/77507952
今日推荐