JPDA(Java Platform Debugger Architecture)提供了JVM内部的访问接口,让我们可以方便地了解JVM内部的状态,可以在此基础上构建调试、性能剖析的平台。
JPDA包括2个接口定义和1个通信协议:
- JVM TI(JVM Tool Interface):定义了JVM提供给外部可以访问的服务,此接口以C/C++的方式提供。利用JDK5开始提供的java.lang.instrutment包,我们可以使用Java语言实现JVM TI中的字节码增强的功能。
- JDWP(Java Debug Wire Protocol):定义了调试器和被调试的应用之间通信的协议JDI(Java Debug Interface):定义了调试客户端可以使用的接口,使用Java语言实现。
Components Debugger Interfaces
/ |--------------|
/ | VM |
debuggee ----( |--------------| <------- JVM TI - Java VM Tool Interface
\ | back-end |
\ |--------------|
/ |
comm channel -( | <--------------- JDWP - Java Debug Wire Protocol
\ |
|--------------|
| front-end |
|--------------| <------- JDI - Java Debug Interface
| UI |
|--------------|
JPDA架构上分成3块:
- 被调试应用:就是debuggee,被调试的应用在内部嵌入一个back-end,一方面back-end通过JVM TI接口访问到VM的内部信息,另一方面,back-end通过某种Transport(通信方式,譬如Sun JVM提供了socket和shmem的Transport)为外部提供了服务。
- 通信协议:调试客户端和被调试方通过某种通信方式进行数据的交互,而JDWP定义了交互的数据的格式
- 调试客户端:调试客户端通过front-end与back-end进行通信,front-end可以理解为JDI接口的实现,调试UI(譬如Eclipse的调试器)通过JDI接口最终访问到服务端的信息
需要注意的是,如上仅仅是调试上的主要架构,JVM TI层不仅仅提供了调试性的接口,也提供了一些可以用于性能剖析的接口。性能剖析一般很多工具在架构上也类似于如上,在被剖析VM上运行Agent(类似于如上中的back-end),而剖析Client(友好的UI功能)连接到Agent上采集数据,只不过在这个过程当中,通信管道协议不一定会使用JDWP,而客户端也可能会是通过一种工具专有的协议从远程获取到剖析信息。