目录

一、java线程状态

二、使用jstack生成进程dump文件

三、统计dump文件中处于不同状态的线程数量

四、举例分析不同状态的线程

1、分析BLOCKED (on object monitor)状态的线程

2、分析TIMED_WAITING (on object monitor)和WAITING (on object monitor)状态的线程

3、分析TIMED_WAITING (sleeping)状态的线程

4、分析TIMED_WAITING (parking)和WAITING (parking)状态的线程

正文

一、java线程状态

二、使用jstack生成进程dump文件

a、先使用ps -ef|grep java找到java进程号

b、jstack pid > /opt/dump/pid.dump

三、统计dump文件中处于不同状态的线程数量

grep java.lang.Thread.State pid.dump| awk '{print $2$3$4$5}' | sort | uniq -c ,例子如下:

四、举例分析不同状态的线程

1、分析BLOCKED (on object monitor)状态的线程

  1. "ExecuteThread: '2' for queue: 'weblogic.socket.Muxer'" daemon prio=10 tid=0x00007fa3a8042800 nid=0x1a3a waiting for monitor entry [0x00007fa3f8764000]
  2. java.lang.Thread.State: BLOCKED (on object monitor)
  3. at weblogic.socket.PosixSocketMuxer.processSockets(PosixSocketMuxer.java:93)
  4. - waiting to lock <0x00000000e1c9f108> (a weblogic.socket.PosixSocketMuxer$1)
  5. at weblogic.socket.SocketReaderRequest.run(SocketReaderRequest.java:29)
  6. at weblogic.socket.SocketReaderRequest.execute(SocketReaderRequest.java:42)
  7. at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:145)
  8. at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:117)

a、线程状态是 Blocked,阻塞状态。说明线程等待资源超时!

b、waiting to lock <0x00000000e1c9f108> 线程在等待给这个 0x00000000acf4d0c0 地址上锁

c、waiting for monitor entry 说明此线程通过 synchronized(obj) {……} 申请进入了临界区,从而进入了“Entry Set”队列,但该 obj 对应的 monitor 被其他

线程拥有,所以本线程在 Entry Set 队列中等待。

d、第一行里,"ExecuteThread: '2' for queue: 'weblogic.socket.Muxer'"是 Thread Name。daemon是守护进程。prio是线程优先级。

tid指Java Thread id。nid指native线程的id。[0x00007fa3f8764000]是线程栈起始地址。

2、分析TIMED_WAITING (on object monitor)和WAITING (on object monitor)状态的线程

  1. "weblogic.GCMonitor" daemon prio=10 tid=0x00007fa3a4006000 nid=0x1ba4 in Object.wait() [0x00007fa327af9000]
  2. java.lang.Thread.State: TIMED_WAITING (on object monitor)
  3. at java.lang.Object.wait(Native Method)
  4. at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
  5. - locked <0x00000000e2241e50> (a java.lang.ref.ReferenceQueue$Lock)
  6. at weblogic.platform.GCMonitorThread.waitForNotification(GCMonitorThread.java:88)
  7. at weblogic.platform.GCMonitorThread.run(GCMonitorThread.java:64)

a、“TIMED_WAITING (on object monitor)”可以看出程序在获得了“<0x00000000e2241e50>”的锁之后,调用了lock.wait(timeout)方法在等待其他线程

调用lock.notify()或lock.notifyAll();

b、WAITING (on object monitor)和TIMED_WAITING (on object monitor)在于前者调用了lock.wait()方法

3、分析TIMED_WAITING (sleeping)状态的线程

  1. "scheduler_QuartzSchedulerThread" prio=10 tid=0x00007fa3a82f0800 nid=0x1aad waiting on condition [0x00007fa3cc39e000]
  2. java.lang.Thread.State: TIMED_WAITING (sleeping)
  3. at java.lang.Thread.sleep(Native Method)
  4. at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:394)

a、“TIMED_WAITING (sleeping)” 可以看出程序调用了Thread.sleep(long millis);

4、分析TIMED_WAITING (parking)和WAITING (parking)状态的线程

  1. "Timer runner-1,TICKET_REGISTRY_76ENV,bjxt-kfcs-46159" daemon prio=10 tid=0x00007fa3a8ad6000 nid=0x1a44 waiting on condition [0x00007fa3cd7b2000]
  2. java.lang.Thread.State: TIMED_WAITING (parking)
  3. at sun.misc.Unsafe.park(Native Method)
  4. - parking to wait for <0x00000000e21c58f0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
  5. at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:198)
  6. at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2116)
  7. at org.jgroups.util.TimeScheduler2.waitUntilNextExecution(TimeScheduler2.java:328)
  8. at org.jgroups.util.TimeScheduler2._run(TimeScheduler2.java:310)
  9. at org.jgroups.util.TimeScheduler2.run(TimeScheduler2.java:268)
  10. at java.lang.Thread.run(Thread.java:662)

a、“TIMED_WAITING (parking)”中的 timed_waiting 指等待状态,但这里指定了时间,到达指定的时间后自动退出等待状态;parking指线程处于挂起中。
b、“waiting on condition”需要与堆栈中的“parking to wait for <0x00000000e21c58f0>” 结合来看。首先,本线程肯定是在等待某个条件的发生,来把自己唤醒。

最新文章

  1. javascript 定时器
  2. Windows Phone8 中如何引用 SQLite 数据库
  3. ubuntu 修改终端命令显示的颜色
  4. 20150625_Andriod_01_ListView1_条目选中
  5. 使用git上传项目
  6. 看了这篇文章,Java编程速度我都惊呆了
  7. IOS Label 自动换行 IOS6和IOS7
  8. 轮值CEO胡厚崑:到2025年所有的企业都将用到云(云的2.0时代,会有几千朵云几万朵云升起来,这将产生不同的技术模式、商业模式、思维模式)
  9. Cloudera Hadoop 5&amp; Hadoop高阶管理及调优课程(CDH5,Hadoop2.0,HA,安全,管理,调优)
  10. CSS设计指南之浮动与清除
  11. 学习Tensorflow,反卷积
  12. 阿里云或本地部署服务器(一)---nginx本地和服务器代理
  13. luogu P4289 [HAOI2008]移动玩具
  14. 每天一点点oracle
  15. C# .NET 配置404,500等错误信息
  16. codeforces 516c// Drazil and Park// Codeforces Round #292(Div. 1)
  17. Java面试&amp; HashMap实现原理分析
  18. P5028 Annihilate
  19. gm(GraphicsMagick)图片中文水印乱码问题
  20. 关于Function原型对象和Object原型对象的一些疑惑

热门文章

  1. ajax, jQuery, jQueryeasyUI
  2. JavaScript Math Object 数字
  3. 是否只查看安全传送的网页内容? 去掉 IE弹出窗口
  4. 有关memcached企业面试案例讲解
  5. 使用嵌入式关系型SQLite数据库存储数据
  6. Jquery 选择器 详解 js 判断字符串是否包含另外一个字符串
  7. [企业化NET]Window Server 2008 R2[1]-服务器基本安装即问题解决记录
  8. mysql密码过期问题
  9. Openssl aes加解密例程 更进一步
  10. 7.翻译:EF基础系列---EF中的实体类型