接下来网上没有,貌似非公开章节,继续摘要。
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。