快速业务通道

基于JVMTI实现Java线程的监控 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19
醒(执行 resume() 方法)或是因为超时而时自动苏醒;当多个线程试图进入某个同步区域(synchronized)时,没能进入该同步区域的线程会被置入锁定集(Lock Pool),直到获得该同步区域的锁,进入就绪状态;当线程执行了某个对象的 wait() 方法时,线程会被置入该对象的等待集(Wait Pool)中,直到执行了该对象的 notify() 方法,wait()/notify() 方法的执行要求线程首先获取到该对象的锁。

死亡状态 (Dead) 线程在 run() 方法执行结束后进入死亡状态。此外,如果线程执行了 interrupt() 或 stop() 方法,那么它也会以异常退出的方式进入死亡状态。

Java 线程切换的上下文信息

通过对 Java 线程模型的分析,可以将 Java 线程切换所涉及的上下文信息分为显式线程切换信息和隐式线程切换信息。在 Java 线程切换时通过 JVMTI 接口捕获线程切换的上下文信息,即可实现对 Java 线程切换的监控。

显式线程切换信息 显式线程切换是指一个线程对象显式地对另一个线程对象进行操作(调用线程方法),使目标线程的状态发生变换;其上下文信息可以用三元组 < 操作线程,动作,被操作线程 > 来描述。例如,Java 线程的启动上下文就可以描述为 <Thread-Caller, start, Thread-Callee>。从 Java 线程模型可知,Java 中线程的创建是通过派生 Thread 类或 Runnable 接口来实现的,并通过调用 Thread 类中的 start() 方法来启动新建立的线程对象;因此,通过监控 start() 方法的调用,并结合对 Java 方法调用堆栈的分析,就可以分析出线程启动的上下文信息。根据 Java 线程模型可知,显式线程切换共涉及到 start()、interrupt()、join()、resume()、suspend()、sleep()、yield() 和 stop() 这几个线程方法。

隐式线程切换信息 在某些情况下,线程的切换并不是通过线程之间直接调用线程方法进行的,而是通过线程间通信的方式进行。这种由线程间通信产生的上下文信息,称之为隐式线程切换信息。一个典型的例子就是 Java 线程池。通常,线程池内存储了若干个预先创建好的线程,这项线程处于阻塞状态,并不处理任务;当某个任务到来的时候,负责任务调度的线程会唤醒线程池中某个处于阻塞状态的空闲线程处理这个任务;一旦任务完成,执行该任务的线程不会被撤销,而是继续处于阻塞状态,并被重新置回线程池中,等待下一次调度。虽然 Java 线程池的实现方式不尽相同,但究其本质都是通过 Java 中 Object 类的线程通信原语 wait() 和 notify()/notifyAll() 方法来实现的。wait() 方法会使线程在指定目标上等待,而 notify() 方法则使等待在指定目标上的某个线程苏醒,具体哪个线程真正被唤醒取决于虚拟机的实现方式, notifyAll() 方法则是使所有的线程都苏醒。隐式线程切换信息同样可以用三元组 < 操作线程,动作,被操作线程 > 来描述,但该三元组的确立比显式线程切换要复杂,需要通过分析线程通信原语执行的上下文信息来得到。

下一节将介绍如何获取线程切换的上下文信息。

Java 线程切换的监控模型

根据 Java 线程切换机制设计的 Java 线程监控模型如图 3 所示。线程监控代理 Agent 通过 JVMTI 在方法调用者和被调用者之间注册一个事件监听器,用于监听线程切换事件(即引起线程切换的方法调用)。当某个线程方法即将被调用的时候,监听器发送方法进入事件(Method Entry)到 Agent 的 Before Advice 回调方法;当某个线程方法返回的时候,监听器发送方法返回(Method Exit)事件到 Agent 的 After Advice 回调方法。Before Advice 和 After Advice 分别负责处理线程方法调用前的线程状态和线程方法调用后的线程状态。这样,线程监控代理就能够监控到 Java 线程的状态切换情况。

图 3. Java 线程监控模型

基于JVMTI实现Java

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号