深入 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 ...
随机推荐
- 使用Python制作一个简单的刷博器
呵呵,不得不佩服Python的强大,寥寥几句代码就能做一个简单的刷博器. import webbrowser as web import time import os count=0 while co ...
- 小白学习之Code First(四)
code first :约定大于配置(通过配置实体重写约定) 通过两种方式配置实体:DataAnnotations Fluent Api System.ComponentModel.Data ...
- 009.在C#.NET中使用Froms验证
原文:https://support.microsoft.com/en-us/kb/301240 (Aty表示本人) 这篇文章演示如何通过数据库,实现Froms验证 必需 Mircosoft Visu ...
- CRC算法
https://blog.csdn.net/dream_1996/article/details/73588269
- CSS3选择器:nth-child和:nth-of-type之间的差异——张鑫旭
一.深呼吸,直接内容 :nth-child和:nth-of-type都是CSS3中的伪类选择器,其作用近似却又不完全一样,对于不熟悉的人对其可能不是很区分,本文就将介绍两者的不同,以便于大家正确灵活使 ...
- vue.js 项目打包
vuejs是个前端框架,npm run dev的目的在于前端开发的时候可以实时调试.所以npm run dev 只是开发时期会用到,在生产环境中我们应该使用nginx,apahce tomcat等应用 ...
- margin相关基本知识
什么是 margin ? CSS 边距属性定义元素周围的空间.通过使用单独的属性,可以对上.右.下.左的外边距进行设置.也可以使用简写的外边距属性同时改变所有的外边距.——W3School 边界,元素 ...
- OnCreateContextMenuListener接口简介
OnCreateContextMenuListener接口是用来处理上下文菜单显示事件的监听接口.该方法是定义和注册上下文菜单的另一种方式.该接口中事件处理的回调方法签名如下所示. public vo ...
- clipChildren属性
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...
- HBase 负载均衡
HBase 可以根据当前集群的负载以region为单位进行rebalance.在HMaster中,后台会起一个线程定期检查是否需要进行rebalance,线程叫做BalancerChore.线程每隔 ...