深入 Java 调试体系: 第 1 部分,初探JPDA 体系
JPDA(Java Platform Debugger Architecture)是 Java 平台调试体系结构的缩写,通过 JPDA 提供的 API,开发人员可以方便灵活的搭建 Java 调试应用程序。
JPDA 主要由三个部分组成:
1)、Java 虚拟机工具接口(JVMTI)
2)、Java 调试线协议(JDWP)
3)、Java 调试接口(JDI)
JPDA各个组成块:
JPDA 定义了一个完整独立的体系,它由三个相对独立的层次共同组成,而且规定了它们三者之间的交互方式,即通信的接口。
这三个层次由低到高分别是 Java 虚拟机工具接口(JVMTI),Java 调试线协议(JDWP)以及 Java 调试接口(JDI)。可以分别比喻为调试者(debugger)和被调试者(debuggee),以及他们中间的通信器。
被调试者:运行于我们想调试的 Java 虚拟机之上,它可以通过 JVMTI 这个标准接口,监控当前虚拟机的信息;
调试者:定义了用户可使用的调试接口,通过这些接口,用户可以对被调试虚拟机发送调试命令,同时调试者接受并显示调试结果。
调试者和被调试者之间:调试命令和调试结果,都是通过 JDWP 的通讯协议传输的。所有的命令被封装成 JDWP 命令包,通过传输层发送给被调试者,被调试者接收到 JDWP 命令包后,解析这个命令并转化为 JVMTI 的调用,在被调试者上运行。类似的,JVMTI 的运行结果,被格式化成 JDWP 数据包,发送给调试者并返回给 JDI 调用。

图1 JPDA模块层次图
当然,开发人员完全可以不使用这完整的三层,根据自己的理解来基于其中的一层来开发自己的应用。例如只通过通过JVMTI函数来开发调试程序等。
这三层的详细介绍如下:
Java 虚拟机工具接口(JVMTI)
JVMTI全称是Java Virtual Machine Tool Interface,中文翻译是Java虚拟机工具接口。它是一套有JVM提供的native接口,它是JPDA体系最底层,也是核心层,所有的调试功能都需要JVMTI来提供。拥有这些接口时,开发者除了可以调试Java程序,还可以查看它们的运行状态、设置回调函数以及控制某些环境变量。在JVMTI之前,还有JVMDI和JVMPI,它们分别用来提供调试Java程序以及Java程序调节性能的功能,在jdk5.0之后就取消了JVMDI和JVMPI这两套接口。JVMDI 在最新的 Java SE 6 中已经不提供支持,而 JVMPI 也计划在 Java SE 7 后被彻底取代。
Java 调试线协议(JDWP)
JDWP全称是Java Debug Wire Protocol,中文翻译是一种专门为Java调试而设计的一个通讯交互协议。协议包里的内容包括请求命令、回应数据以及错误代码。Sun公司的实现为jdwp.dll(jdwp.so),它实现了一个代理,负责解析前端向JVM发送的请求或命令,将其转化为JVMTI调用,然后将JVMTI函数的返回值封装成JDWP数据包发给前端。注意:JDWP本身不包括传输层的实现,传输层需要独立实现,但是JDWP包含了和传输层交互的严格定义。Sun公司提供的jdk中,在传输层上它提供了socket方式。
Java 调试接口(JDI)
JDI全称是Java Debug Interface,是三个模块中的最高层,在大多数JDK中,它都是有Java语言来实现的,通过它,开发者可以通过前端JVM上的调试器来调试后端JVM上被调试的程序。
Java调试接口的特点
Java语言是第一个使用虚拟机的编程语言,由于虚拟机的存在,只要掌握了虚拟机,就掌握了内存分配、线程管理、即时优化等运行状态。这样来,Java调试的本质,就是和JVM交互,这和其它语言是有着本质的区别。
参考资料http://www.ibm.com/developerworks/cn/java/j-lo-jpda1/index.html
深入 Java 调试体系: 第 1 部分,初探JPDA 体系的更多相关文章
- 深入 Java 调试体系: 第 1 部分,JPDA 体系概览
JPDA 概述 所有的程序员都会遇到 bug,对于运行态的错误,我们往往需要一些方法来观察和测试运行态中的环境.在 Java 程序中,最简单的,您是否尝试过使用 System.out.println( ...
- Java调试平台体系JPDA
Java 平台调试体系(Java Platform Debugger Architecture,JPDA)定义了一个完整独立的体系,它由三个相对独立的层次共同组成,而且规定了它们三者之间的交互方式,或 ...
- Java调试
线上load高的问题排查步骤是: 先用top找到耗资源的进程 ps+grep找到对应的java进程/线程 jstack分析哪些线程阻塞了,阻塞在哪里 jstat看看FullGC频率 jmap看看有没有 ...
- Java调试那点事[转]
转自云栖社区:https://yq.aliyun.com/articles/56?spm=5176.100239.blogcont59193.11.jOh3ZG# 摘要: 该文章来自于阿里巴巴技术协会 ...
- java调试一
Eclipse 平台的特色在于内置了 Java 调试器,该调试器提供所有标准调试功能,包括进行单步执行.设置断点和值.检查变量和值以及暂挂和恢复线程的能力.Eclipse 平台工作台(Eclipse ...
- java调试器
javac.exe是编译.java文件 java.exe是执行编译好的.class文件 javadoc.exe是生成Java说明文档 jdb.exe是Java调试器 javaprof.exe是剖析工具 ...
- Java生鲜电商平台-电商会员体系搭建
Java生鲜电商平台-电商会员体系搭建 说明:因为之前一直从事的是B端的生鲜电商方面的产品,对会员体系方面有深刻的理解,今天来聊一聊会员体系的搭建. 明确会员体系的目的 首先我们需要明确的知道,搭建电 ...
- Java生鲜电商平台-电商会员体系系统的架构设计与源码解析
Java生鲜电商平台-电商会员体系系统的架构设计与源码解析 说明:Java生鲜电商平台中会员体系作为电商平台的基础设施,重要性不容忽视.我去年整理过生鲜电商中的会员系统,但是比较粗,现在做一个最好的整 ...
- [转载]Java程序员掌握的10大项知识体系--精通太难说出口
1.语法:必须比较熟悉,在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息知道是什么样的语法错误并且知道任何修正. 2.命令:必须熟悉JDK带的一些常用命令及其常用选项,命令至少需要熟悉:a ...
随机推荐
- MySql__centos6.5源码安装
安装MySql步骤如下: 依赖包检查安装 配置防火墙 配置hosts文件 配置sysctl.cnf 检查是否安装mysql 如果有卸载掉(指的是没有用的mysql) 创建用户属组 创建相应目录并修改权 ...
- JS 重写alert,使之能输出多个参数
windows._alert = windows.alert; windows.alert = function(){ _alert = (Array.prototype.slice(argument ...
- Storm框架:如何消费RabbitMq消息(代码案例)
1.定义拓扑topology public class MessageTopology { public static void main(String[] args) throws Exceptio ...
- win32FTP程序设计
掌握socket基于事件机制的网络程序设计,掌握多线程技术的FTP Server端设计方法,掌握FTP标准基本协议及其程序的实现,掌握文件内容的网络传输设计方法. 利用CFtpServer类接收和解析 ...
- Effective C++ 避免数组多态
#include <iostream> #include <cstdlib> using namespace std; class Base { public: int idx ...
- 自定义指令directive基础用法
官方链接:http://doc.vue-js.com/v2/guide/custom-directive.html#simplest-directive-example 在main.js中注册自定义指 ...
- vue 面试时需要准备的知识点
前端火热的框架层出不穷,作为码农的我们,依旧需要去学习,去探索新的问题,学习新技术,其实就是为了写一手好的,自认为是高质量的代码.今天主要分享一下前端最火的框架vue,也是我比较喜欢的框架. vue上 ...
- Asp.net MVC 移除不用的视图引擎
Asp.net MVC 默认提供两个视图引擎,分别为: WebFormViewEngine 和 RazorViewEngine.MVC在查找视图时,会按照指定的顺序进行查找.当我们的MVC程序未找到相 ...
- EOS开发经验总结——不定期持续更新中
一.新手安装mysql乱码问题 1.数据库安装时设置默认编码格式为UTF8或者打开mysql安装目录下my.ini,变更default-character-set=utf8: 2.打开EOS的Gove ...
- js map()处理数组和对象数据
之前的文章梳理了JS数组与对象属性的遍历方法,本文介绍专门用以遍历并处理数据的map()方法. 一.原生map() map()是数组的一个方法,它创建一个新数组,其结果是该数组中的每个元素都调用一个提 ...