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占用过高的具体代码的位置,进而再深入分析原因,当然我们这里的代码没有太大的价值,只是产生了很多的线程,大量的线程在排队等待执行。