Java千百问_08JDK详解(012)_JPDA是什么

点击进入_更多_Java千百问

1、JPDA是什么

我们可以通过常见的Java IDE提供的图形界面调试工具进行代码调试,甚至可以使用JDK自带的jdb工具,以文本命令的形式来调试Java 程序,这些形形色色的调试工具都是通过JPDA开发的。

JPDA(Java Platform Debugger Architecture)是 Java平台调试体系结构的缩写,通过JPDA提供的API,开发人员可以方便灵活的搭建Java调试工具。

JPDA主要由三个部分组成:Java虚拟机工具接口(JVMTI,Java Virtual Machine Profiler Interface)、Java调试线协议(JDWP,Java Debug Wire Protocol)、 Java 调试接口(JDI,Java Debug Interface)。具体如下:

  1. Java虚拟机工具接口(JVMTI,Java Virtual Machine Tool Interface)
    Java虚拟机工具接口,它是一套由虚拟机直接提供的本地接口(native API)。它处于整个JPDA体系的最底层,所有调试功能本质上都需要通过JVMTI来提供。
    通过这些接口,开发人员不仅可以调试在该虚拟机上运行的Java程序,还能查看它们运行的状态、设置回调函数、控制某些环境变量,从而进行优化和提升。JVMTI的前身是JVMDI和JVMPI,它们原来分别被用于提供调试Java程序以及调节性能的功能,在Java 5之后,由JVMTI取代了它们。
    了解JVMTI看这里:JVMTI是什么

  2. Java调试线协议(JDWP,Java Debug Wire Protocol)
    Java调试线协议,是一个为Java调试而制定的通讯交互协议,它定义了调试器和被调试程序之间传递信息的格式。JDWP详细完整地定义了请求命令、响应数据和错误代码,保证了调试器和被调试程序间JVMTI和JDI的通信通畅。
    这里需要注意的是,JDWP本身并不包括传输层的实现,JDWP只包括了和传输层交互的定义。

  3. Java 调试接口(JDI)
    Java调试接口,是三个模块中最高层的接口,由Java语言实现。 JDI为开人人员提供了若干接口,不仅能格式化JDWP数据,而且还能为JDWP数据传输提供队列、缓存等优化服务。通过它,开发人员就能远程操控后端虚拟机上被调试程序的运行。我们一般的调试器也都是通过JDI接口构造出一套界面化的工具,达到易用的目的。

2、JPDA如何运行

JPDA的调试过程有几个重要的概念:调试者、被调试者、通信器。具体如下:

  1. 被调试者
    运行于我们想调试的Java虚拟机之上,它可以通过JVMTI这个标准接口,监控当前虚拟机的信息。

  2. 调试者
    定义了用户可使用的调试接口,通过这些接口,用户可以对被调试虚拟机发送调试命令,同时调试者接受并显示调试结果。

  3. 通信器
    将调试者与被调试着之间的调试命令和调试结果,封装成JDWP协议的包进行传输的。

一次完整的调试过程如下:

  1. 通信器把调试者的调试命令被封装成JDWP命令包,通过传输层发送给被调试者。

  2. 被调试者接收到JDWP命令包后,解析这个命令并转化为JVMTI的调用,在被调试者上运行。

  3. JVMTI的运行结果,被格式化成JDWP数据包,发送给调试者并返回给JDI调用。

  4. 开发所使用的调试器通过JDI得到数据,并可以发出操作指令。

具体过程如图:

Java千百问_08JDK详解(012)_JPDA是什么_第1张图片

这里要说一点,每一个虚拟机都应该实现JVMTI接口,但是JDWP和JDI本身与虚拟机并不是不可分的。这三个层之间是通过标准的交互接口和通信协议联系起来的,因此它们可以被独立替换或取代。因此,开发自己的JDWP和JDI就可以定制自己的调试工具。
例如,Apache提供了JDWP的实现。Eclipse一个子项目org.eclipse.jdt.debug提供了JDI实现。通过标准协议,Eclipse IDE的调试工具就可以完全在Apache的环境上运行。

3、JPDA都有哪些特点

  1. 直接操作虚拟机
    在我们调试C/C++程序时,需要先编译一个debug模式的程序,这个程序一般来说非常大。调试过程中,调试者要创建一个运行态,它的程序算法比较复杂,性能消耗也很多。
    而Java则不同,由于Java的运行态已经被虚拟机所很好地管理,因此作为Java的调试者无需再创造一个可控的运行态,而仅仅需要去操作虚拟机就可以了。

  2. C/S架构
    JPDA实际上是一个C/S架构,只要符合JDWP协议,我们甚至可以通过网络,在任意地点调试远程的虚拟机。它很好地解决了部署和测试的问题,满足了网络时代中的开发应用的需求。

  3. 效率高
    由于Java程序本身就是编译成字节码运行在虚拟机上的,因此调试前后的程序、内存占用都不会有大变化(仅需要启动一个JDWP所需要的内存)。

  4. 十分灵活
    Java调试工具是建立在强大的虚拟机上的,因此,很多应用都可以通过对虚拟机的改进而得到实现,例如动态编译运行,字节码实时替换。

你可能感兴趣的:(java调试体系结构,自定义调试器,java-JPDA,JPDA体系详解,开发java调试工具)