一郎科技|Jvm - jstack工具( 二 )

通过synchronized关键字,成功获取到了对象的锁,成为监视器的拥有者,在临界区内操作 。 对象锁是可以线程重入的 。
2. waiting to lock
at com.jiuqi.dna.core.impl.CacheHolder.isVisibleIn(CacheHolder.java:165)- waiting to lock <0x0000000097ba9aa8> (a CacheHolder)at com.jiuqi.dna.core.impl.CacheGroup$Index.findHolderat com.jiuqi.dna.core.impl.ContextImpl.findat com.jiuqi.dna.bap.basedata.common.util.BaseDataCenter.findInfo通过synchronized关键字,没有获取到了对象的锁,线程在监视器的进入区等待 。 在调用栈顶出现,线程状态为Blocked 。
3. waiting on
at java.lang.Object.wait(Native Method)- waiting on <0x00000000da2defb0> (a WorkingThread)at com.jiuqi.dna.core.impl.WorkingManager.getWorkToDo- locked <0x00000000da2defb0> (a WorkingThread)at com.jiuqi.dna.core.impl.WorkingThread.run通过synchronized关键字,成功获取到了对象的锁后,调用了wait方法,进入对象的等待区等待 。 在调用栈顶出现,线程状态为WAITING或TIMED_WATING 。
4. parking to wait for
park是基本的线程阻塞原语,不通过监视器在对象上阻塞 。 随concurrent包会出现的新的机制,不synchronized体系不同 。
线程动作线程状态产生的原因
runnable:状态一般为RUNNABLE 。
in Object.wait():等待区等待,状态为WAITING或TIMED_WAITING 。
waiting for monitor entry:进入区等待,状态为BLOCKED 。
waiting on condition:等待区等待、被park 。
sleeping:休眠的线程,调用了Thread.sleep() 。
Wait on condition 该状态出现在线程等待某个条件的发生 。 具体是什么原因 , 可以结合 stacktrace来分析 。最常见的情况就是线程处于sleep状态 , 等待被唤醒 。常见的情况还有等待网络IO:在java引入nio之前 , 对于每个网络连接 , 都有一个对应的线程来处理网络的读写操作 , 即使没有可读写的数据 , 线程仍然阻塞在读写操作上 , 这样有可能造成资源浪费 , 而且给操作系统的线程调度也带来压力 。 在 NewIO里采用了新的机制 , 编写的服务器程序的性能和可扩展性都得到提高 。正等待网络读写 , 这可能是一个网络瓶颈的征兆 。 因为网络阻塞导致线程无法执行 。 一种情况是网络非常忙 , 几乎消耗了所有的带宽 , 仍然有大量数据等待网络读写;另一种情况也可能是网络空闲 , 但由于路由等问题 , 导致包无法正常的到达 。 所以要结合系统的一些性能观察工具来综合分析 , 比如 netstat统计单位时间的发送包的数目 , 如果很明显超过了所在网络带宽的限制 ; 观察 cpu的利用率 , 如果系统态的 CPU时间 , 相对于用户态的 CPU时间比例较高;如果程序运行在 Solaris 10平台上 , 可以用 dtrace工具看系统调用的情况 , 如果观察到 read/write的系统调用的次数或者运行时间遥遥领先;这些都指向由于网络带宽所限导致的网络瓶颈 。 (来自)
线程Dump的分析1. 原则
结合代码阅读的推理 。 需要线程Dump和源码的相互推导和印证 。
造成Bug的根源往往不会在调用栈上直接体现,一定格外注意线程当前调用之前的所有调用 。
2. 入手点
1) 进入区等待
"dthread.start();}}class Thread1 implements Runnable{@Overridepublic void run() {while(true){System.out.println(1);}}}线程堆栈信息如下:
"Reference Handler" daemon prio=10 tid=0x00007fbbcc06e000 nid=0x286c in Object.wait() [0x00007fbbc8dfc000]java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on