jstack(java堆栈)生成的Thread Dump日志线程状态
jstack命令的语法格式: jstack <pid>。可以用jps查看java进程id
"KpiAlarmThread-2" #31 prio=5 os_prio=0 tid=0x00007fc101658000 nid=0x1b891 waiting on condition [0x00007fc0c5c5b000]
java.lang.Thread.State: TIMED_WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000005c08bbdc8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:467)
at com.aaa.perf2alarm.thread.SendMsgTask.run(SendMsgTask.java:37)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
1、"KpiAlarmThread-2" 线程名称:如果使用 java.lang.Thread 类生成一个线程的时候,线程名称为 Thread-(数字) 的形式,这里是resin生成的线程;
2、prio=5 线程优先级:默认为5,数字越大优先级越高;
3、tid=0x00007fc101658000 JVM线程的id:JVM内部线程的唯一标识,通过 java.lang.Thread.getId()获取,通常用自增的方式实现;
4、nid=0x1b891系统线程id:对应的系统线程id(Native Thread ID),可以通过 top 命令进行查看,现场id是十六进制的形式;
5、waiting on condition 系统线程状态:这里是系统的线程状态,具体的含义见下面 系统线程状态 部分;
deadlock:死锁线程,一般指多个线程调用期间进入了相互资源占用,导致一直等待无法释放的情况。
runnable:一般指该线程正在执行状态中,该线程占用了资源,正在处理某个操作,如通过SQL语句查询数据库、对某个文件进行写入等。
blocked:线程正处于阻塞状态,指当前线程执行过程中,所需要的资源长时间等待却一直未能获取到,被容器的线程管理器标识为阻塞状态,可以理解为等待资源超时的线程。
waiting on condition:线程正处于等待资源或等待某个条件的发生,具体的原因需要结合下面堆栈信息进行分析。
6、[0x00007fc0c5c5b000] 起始栈地址:线程堆栈调用的其实内存地址;
7、java.lang.Thread.State: TIMED_WAITING (parking)JVM线程状态:这里标明了线程在代码级别的状态
NEW:至今尚未启动的线程的状态。线程刚被创建,但尚未启动。
RUNNABLE:可运行线程的线程状态。线程正在JVM中执行,有可能在等待操作系统中的其他资源,比如处理器。
BLOCKED:受阻塞并且正在等待监视器的某一线程的线程状态(抢到就可以走)
WAITING:一个线程等待另一个线程执行一个动作(同意走才可以走)
TIMED_WAITING:要给线程再一个特定的等待时间内等待另一个线程完成一个动作(时间到了就可以走)
TERMINATED:线程处于终止状态。
8、线程调用栈信息:下面就是当前线程调用的详细栈信息,用于代码的分析。堆栈信息应该从下向上解读,因为程序调用的顺序是从下向上的。