`

读书笔记:《分布式JAVA应用 基础与实践》 第三章 3.3 JVM线程资源同步及交互机制(二)

阅读更多

接下来网上没有,貌似非公开章节,继续摘要。

 

3.3.2 线程交互机制

1. 常规方法:wait/notify/notifyAll

当线程调用了对象的wait方法后,JVM线程执行引擎会将此线程放入一个wait sets中,并释放此对象的锁,在wait sets中的线程将不会被JVM线程执行引擎调度执行;当其它线程调用了此对象的notify方法时,会从wait sets中随机找一个等待在此对象的线程唤醒。

 

2. SUN JDK5.0后,增加了并发包,提供了更多的方式来支持线程间的交互。例如Semphore的acquire和release,Condition的await和signal,CountDownLatch的await和countDown等。

 

3.3.3 线程状态及分析

为跟踪运行时JVM线程的状况,JDK及开源界提供了一些不错的工具,以帮助判断什么操作耗费资源,什么操作导致锁竞争激烈或死锁现象。

1. kill -3 [pid]   

    输出线程信息至Console

2. jstack

    jdk/bin目录下,也是查看线程信息

3. JConsole

    同样位于jdk/bin目录下,可用于图形化跟踪查看运行时系统中线程的状况(运行状态、锁等待、堆栈、检测死锁等)

4. TDA

    开源界一个不错的用于分析线程堆栈信息的图形化工具,通过此工具可以比较方便地分析线程堆栈中等待锁的线程、各种状态的线程及运行时间较长的线程等

5. TOP命令 + ThreadDump

      通过以上几种方式都可以dump出JVM中的线程信息,而结合linux中的TOP命令,可以更轻松地分析目前线程消耗CPU的状况,包括消耗CPU总时间及实时CPU消耗率比较,方法如下:

      在linux上输入TOP,在进入TOP后按[shift]+[H]组合键,再按线程的方式查看线程ID、CPU的消耗状况等。通过这种方式获取耗CPU的线程后,结合ThreadDump信息具体查看消耗CPU的线程在做的动作。这里要注意的是,TOP中显示的是十进制的线程ID,而ThreadDump中的nid(即Native ID)对应的十六进制,因此在查找时需要先做次转换。

 

     除了上面提及的这些工具外,在业界还有不少商业的可用于分析JAVA程序线程状况的工具,如JProfiler。

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics