Atitit.获取swing ui 按钮控件的id 与名字 与JPDA 调节和测试连串

Atitit.获取swing ui 按钮控件的id 与名字 与JPDA 调节和测试种类

 

Atitit.获取swing ui 按钮控件的id 与名字 与JPDA 调节和测试体系

1. Swing Inspector是一个Java Swing/AWT用户界面分析和调节工具,作用与firebug类似,2

 

2. 类似spylite ,firebug3

1. Swing Inspector是二个Java Swing/AWT用户界面分析和调节和测试工具,功效与firebug类似,2

3. Eclipse  vm param3

2. 类似spylite ,firebug3

4. Cltr+f12出示主界面3

3. Eclipse  vm param3

5. Ctrl+鼠标找到控件3

4. Cltr+f12体现主界面3

6. JPDA(Java Platform Debugger Architecture)是 Java 平台调节和测试种类布局的缩写。4

5. Ctrl+鼠标找到控件3

6.1. Java 调节和测试接口的特色4

6. JPDA(Java Platform Debugger Architecture)是 Java 平台调节和测试系列布局的缩写。4

6.2. JPDA 组成模块5

6.1. Java 调节和测试接口的特色4

6.3. JVMTI 的简介6

6.2. JPDA 组成模块5

6.4. Agent 的办事历程7

6.3. JVMTI 的简介6

6.4.1. 启动7

6.4. Agent 的工作经过7

6.5. JVMTI 基本效用7

6.4.1. 启动7

6.5.1. 事件处理和回调函数7

6.5. JVMTI 基本功效7

6.5.2. 内部存款和储蓄器控制和对象得到8

6.5.1. 事件处理和回调函数7

6.5.3. 线程和锁8

6.5.2. 内部存款和储蓄器控制和对象获得8

6.5.4. 调剂成效9

6.5.3. 线程和锁8

6.6. 首要部分9

6.5.4. 调剂功效9

6.6.1. Java 虚拟机工具接口(JVMTI)9

6.6. 关键部分9

6.6.2. Java 调节和测试线协议(JDWP)9

6.6.1. Java 虚拟机工具接口(JVMTI)9

6.6.3. Java 调节和测试接口(JDI)10

6.6.2. Java 调节和测试线协议(JDWP)9

7. 找到源码10

6.6.3. Java 调节和测试接口(JDI)10

 

7. 找到源码10

1. Swing Inspector是贰个Java Swing/AWT用户界面分析和调节工具,成效与firebug类似,

具有强有力的Swing/AWT用户界面分析和调剂相关作用。 适用于从java swing初级到高档的有所开发职员,能够飞快定位难题,UI快捷调节和测试,分析其余软件界面包车型大巴贯彻原理,能够给开发工效带来大幅度升级。

特点:

1. 具备UI组件联合浮动作效果应,在用户界面中Ctrl+移动鼠标(Mac OSX ⌘+F12),能够在Swing Inspector主界面中展现对应组件新闻,并高亮当前Component。

2. 方可在Swing Inspector组件树中联合浮动到用户界面,即双向联合浮动,且不供给提供界面包车型地铁源代码。

3. Applet匡助,能够一定嵌入到任何网页中的applet界面。

4. 精锐的window捕获效率,能够捕获加载agent的jvm创制的拥有Swing/AWT窗口(网页中的applet,浏览器加载appet/webstart后运维的console窗口),情势对话框等。

5. 赤褐,无需安装,只需给java命令添加一行参数,即可运转Swing Inspector。

6. 支撑全部的AWT/Swing程序,netbeans、visualvm等。

7. 精锐的表明式帮衬,允许对选定组进执行表明式运算,实时展现总括结果,运算结果辅助属性浏览和编制。

8. 强劲的Javascript辅助功效,帮助用javascript实时修改用户界面中的组件,执行脚本后及时生效。

9. 高质量,焦点功效应用c/c++落成,直接操纵jvm,对品质影响极小,主界面选拔lazy机制,刷新组件时只更新可知viewer。属性编辑器可径直修改选定的机件属性,且直接生效。

10. 能够记录组件添加到parent时的stacktrace,能够急迅稳定到对应的代码行。

11. 简便易用,火速键与常用软件一致(F5刷新、Alt+Left后退,Alt+Right前进等),界面11分不难、直观,没有读书花费。

12. 免费,为软件行业进步尽一份力量是大家的宏旨

 

 

作者:: 老哇的爪子 Attilax 艾龙,  EMAIL:14665一九八二9@qq.com

转发请注解来源: http://www.cnblogs.com/attilax/

 

 

2. 类似spylite ,firebug

1. Swing Inspector是1个Java Swing/AWT用户界面分析和调节工具,效率与firebug类似,

抱有强大的Swing/AWT用户界面分析和调剂相关职能。 适用于从java swing初级到高级的装有开发人员,能够高效定位难点,UI飞速调节和测试,分析别的软件界面包车型地铁落到实处原理,能够给支付工效带来小幅进步。

特点:

1. 具备UI组件联合浮动作用,在用户界面中Ctrl+移动鼠标(Mac OSX ⌘+F12),能够在Swing Inspector主界面中突显对应组件新闻,并高亮当前Component。

2. 足以在Swing Inspector组件树中联合浮动到用户界面,即双向联动,且不须求提供界面包车型大巴源代码。

3. Applet协助,能够稳定嵌入到任何网页中的applet界面。

4. 强有力的window捕获功用,能够捕获加载agent的jvm成立的有所Swing/AWT窗口(网页中的applet,浏览器加载appet/webstart后运行的console窗口),方式对话框等。

5. 大青,无需安装,只需给java命令添加一行参数,即可运维Swing Inspector。

6. 支撑具备的AWT/Swing程序,netbeans、visualvm等。

7. 强有力的表明式帮忙,允许对选定组进执行表达式运算,实时展现计算结果,运算结果援助属性浏览和编辑。

8. 有力的Javascript帮忙成效,协助用javascript实时修改用户界面中的组件,执行脚本后随即生效。

9. 高品质,宗旨作用利用c/c++达成,直接操纵jvm,对品质影响一点都不大,主界面选拔lazy机制,刷新组件时只更新可知viewer。属性编辑器可径直修改选定的组件属性,且一向生效。

10. 足以记下组件添加到parent时的stacktrace,能够急迅稳定到相应的代码行。

11. 大概易用,快速键与常用软件一致(F5刷新、Alt+Left后退,Alt+Right前进等),界面十二分简洁、直观,没有读书花费。

12. 免费,为软件行业提升尽一份力量是我们的宏旨

 

 

作者:: 老哇的爪子 Attilax 艾龙,  EMAIL:14665一九八五9@qq.com

转发请表明来源: http://blog.csdn.net/attilax

 

3. Eclipse  vm param

 

-agentpath:E:\swing-inspector-windows-1.2.2_beta7\Win32\swing-inspector-agent.dll

2. 类似spylite ,firebug

4. Cltr+f12展现主界面

 

3. Eclipse  vm param

 

-agentpath:E:\swing-inspector-windows-1.2.2_beta7\Win32\swing-inspector-agent.dll

5. Ctrl+鼠标找到控件

 

 

亿万先生: 1 

Create StackTrace – javax.swing.JLabel@7293796
    com.openbravo.pos.sales.JPanelTicket.initComponents(JPanelTicket.java:1226)
    com.openbravo.pos.sales.JPanelTicket.(JPanelTicket.java:187)
    com.openbravo.pos.sales.JPanelTicketSales.(JPanelTicketSales.java:18)
    aaaAtiDslParser.aaa33.main(aaa33.java:29

 

 

4. Cltr+f12呈现主界面

 

6. javaagent的重点意义如下:

· 能够在加载class文书在此之前做阻止,对字节码做修改 

· 能够在运作期对已加载类的字节码做改变,不过那种气象下会有广大的界定,前边会详细说 

· 还有此外部分小众的效应 

o 获取具有曾经加载过的类 

o 获取具有曾经初叶化过的类(执行过clinit方法,是地点的一个子集) 

o 获取有些对象的大小 

o 将某些jar参加到bootstrap classpath里当作高优先级被bootstrapClassloader加载 

o 将某个jar加入到classpath里供AppClassloard去加载 

o 设置有些native方法的前缀,主要在探寻native方法的时候做规则匹配 

 

 

5. Ctrl+鼠标找到控件

 

 

 

Create StackTrace – javax.swing.JLabel@7293796
    com.openbravo.pos.sales.JPanelTicket.initComponents(JPanelTicket.java:1226)
    com.openbravo.pos.sales.JPanelTicket.(JPanelTicket.java:187)
    com.openbravo.pos.sales.JPanelTicketSales.(JPanelTicketSales.java:18)
    aaaAtiDslParser.aaa33.main(aaa33.java:29) 

 

 

7. JPDA(Java Platform Debugger Architecture)是 Java 平台调节和测试体系布局的缩写。

因而 JPDA 提供的 API,开发人士能够方便灵活的搭建 Java 调节和测试应用程序。 JPDA 首要由四个部分构成:Java 虚拟机工具接口(JVMTI)、Java 调节和测试线协议(JDWP),以及 Java 调节和测试接口(JDI)。

 

 

6. javaagent的首要作用如下:

· 能够在加载class文书在此之前做阻止,对字节码做修改 

· 能够在运营期对已加载类的字节码做变更,然则那种情况下会有数见不鲜的限定,后边会详细说 

· 还有别的一些小众的成效 

亿万先生:,o 获取具有曾经加载过的类 

o 获取具有曾经早先化过的类(执行过clinit方法,是地点的一个子集) 

o 获取某些对象的大小 

o 将某些jar参与到bootstrap classpath里当作高优先级被bootstrapClassloader加载 

o 将某个jar加入到classpath里供AppClassloard去加载 

o 设置有些native方法的前缀,首要在检索native方法的时候做规则匹配 

 

 

7.1. Java 调节和测试接口的特点

Java 语言是首先个使用虚拟机概念的流行的编制程序语言,就是因为虚拟机的留存,使不少政工变得简单而轻松,了解了虚拟机,就控制了内部存储器分配、线程管理、即时优化等等运营态。同样的,Java 调节和测试的本质,便是和虚拟机打交道,通过操作虚拟机来达成观望调节和测试我们温馨代码的目标。这一个特点决定了 Java 调节和测试接口和原先别的编程语言的伟大区别。

以 C/C++ 的调剂为例,近年来比较流行的调节工具是 GDB 和微软的 Visual Studio 自带的 debugger,在那种 debugger 中,首先,大家必须编译三个“ debug ”方式的次序,那几个会比实际的 release 方式先后大过多。其次,在调节进程中,debugger 将会深层接入程序的周转,精通和决定运维态的片段音讯,并将那几个音讯及时回到。那种参加对运作的频率和内存占用都有早晚的急需。基于那几个供给,这个 Debugger 本人其实是提供了,也许说,创造和保管了四个运行态,因而他们的顺序算法相比较复杂,个头都比较大。对于远端的调节,GDB 也绝非很好的暗中认可完结,当然,C/C++ 在那方面也远非特意大的须求。

 

 

而 Java 则区别,由于 Java 的运营态已经被虚拟机所很好地管理,因而作为 Java 的 Debugger 无需再自身创制一个可控的运营态,而独自需求去操作虚拟机就足以了。 Java 的 JPDA 就是一套为调节和测试和优化服务的虚拟机的操作工具,当中,JVMTI 是结合在虚拟机中的接口,JDWP 是三个通信层,而 JDI 是前者为开发人士准备好的工具和平运动行库。

从构架上说,大家能够把 JPDA 看作成是四个 C/S 连串布局的接纳,在那么些构架下,大家能够便宜地经过网络,在随心所欲的地点调节和测试另外2个虚拟机上的主次,这几个就很好地消除了陈设和测试的题材,特别满意化解了众多网络时期中的开发应用的须求。前端和后端的分离,也有益用户支出适合于本身的调剂工具。

从功用上看,由于 Java 程序自己就是编写翻译成字节码,运转在虚拟机上的,因而调节和测试前后的次序、内部存款和储蓄器占用都不会有大转移(仅仅是开发银行3个 JDWP 所需求的内部存款和储蓄器),任意档次都可以很好地调试,格外有利。而 JPDA 构架下的多少个组成都部队分,JDWP 和 JDI 都相比小,首要的干活得以让虚拟机本身做到。

从灵活性上,Java 调节和测试工具是创立在强大的虚拟机上的,因此,很多前敌的运用,比如动态编写翻译运行,字节码的实时替换等等,都得以因此对虚拟机的咬文嚼字而取得落实。随着虚拟机技术的逐步进步和深刻,各样不一致品类,不一致应用领域中虚拟机的产出,各个强大的效率的进入,给我们的调剂工具也拉动诸多新的选拔。

同理可得,一个先特性的,可控的运作态给 Java 的调节工作,给 Java 调节和测试接口带来了庞然大物的优势和方便。通过 JPDA 那个正式,大家可以从虚拟机中取得大家所急需的音信,实现我们所企望的操作,更好地开发大家的顺序。

 

7. JPDA(Java Platform Debugger Architecture)是 Java 平台调节和测试类别布局的缩写。

因而 JPDA 提供的 API,开发人士能够方便灵活的搭建 Java 调节和测试应用程序。 JPDA 重要由两个部分构成:Java 虚拟机工具接口(JVMTI)、Java 调试线协议(JDWP),以及 Java 调节和测试接口(JDI)。

 

 

7.2. JPDA 组成模块

JPDA 定义了一个完好独立的系统,它由五个相对独立的层系共同整合,而且规定了它们三者之间的交互格局,也许说定义了它们通讯的接口。那八个层次由低到高分别是 Java 虚拟机工具接口(JVMTI),Java 调节和测试线协议(JDWP)以及 Java 调节和测试接口(JDI)。那七个模块把调节和测试进度分解成多少个很自然的概念:调节和测试者(debugger)和被调节和测试者(debuggee),以及他们中间的通信器。被调节和测试者运转于大家想调试的 Java 虚拟机之上,它可以通过 JVMTI 这么些标准接口,监察和控制当前虚拟机的新闻;调节和测试者定义了用户可接纳的调节和测试接口,通过那么些接口,用户能够对被调剂虚拟机发送调节和测试命令,同时调试者接受并体现调节和测试结果。在调节和测试者和被调剂着之间,调节和测试命令和调剂结果,都以经过 JDWP 的通信协议传输的。全部的通令被封装成 JDWP 命令包,通过传输层发送给被调节和测试者,被调节和测试者接收到 JDWP 命令包后,解析那一个命令并转载为 JVMTI 的调用,在被调节和测试者上运维。类似的,JVMTI 的运转结果,被格式化成 JDWP 数据包,发送给调节和测试者并回到给 JDI 调用。而调节和测试器开发职员正是经过 JDI 获得数码,发出命令。图 2 出示了这些历程:

7.1. Java 调节和测试接口的天性

Java 语言是第3个利用虚拟机概念的风行的编制程序语言,正是因为虚拟机的存在,使许多作业变得简单而轻松,精晓了虚拟机,就控制了内部存款和储蓄器分配、线程管理、即时优化等等运转态。同样的,Java 调节和测试的精神,正是和虚拟机打交道,通过操作虚拟机来达到观看调节和测试大家协调代码的指标。那几个特点决定了 Java 调节和测试接口和以前其余编程语言的高大分歧。

以 C/C++ 的调节和测试为例,近来相比较流行的调剂工具是 GDB 和微软的 Visual Studio 自带的 debugger,在那种 debugger 中,首先,大家务必编写翻译1个“ debug ”格局的程序,那些会比实际的 release 模式先后大过多。其次,在调节进度中,debugger 将会深层接入程序的运维,掌握和操纵运营态的一对音信,并将那些消息立刻回到。这种参加对运作的效用和内部存款和储蓄器占用都有早晚的必要。基于那一个要求,那么些 Debugger 本人其实是提供了,或许说,制造和管制了2个运营态,由此他们的先后算法比较复杂,个头都相比大。对于远端的调节和测试,GDB 也绝非很好的暗中认可达成,当然,C/C++ 在那上边也远非越发大的需要。

 

 

而 Java 则区别,由于 Java 的运营态已经被虚拟机所很好地管理,因而作为 Java 的 Debugger 无需再自己创设1个可控的运营态,而独自须求去操作虚拟机就足以了。 Java 的 JPDA 正是一套为调节和测试和优化服务的虚拟机的操作工具,个中,JVMTI 是结合在虚拟机中的接口,JDWP 是三个通信层,而 JDI 是前者为开发人士准备好的工具和运营库。

从构架上说,大家得以把 JPDA 看作成是叁个 C/S 体系布局的行使,在那一个构架下,大家得以方便地通过互联网,在随心所欲的地址调节和测试此外多少个虚拟机上的先后,那几个就很好地化解了配置和测试的难点,更加知足化解了广大互联网时期中的开发应用的急需。前端和后端的分别,也有利用户支付适合于自个儿的调剂工具。

从成效上看,由于 Java 程序本身便是编写翻译成字节码,运维在虚拟机上的,由此调节和测试前后的次序、内部存款和储蓄器占用都不会有大转移(仅仅是运营一个 JDWP 所须要的内部存储器),任意档次都足以很好地调节和测试,极度有利。而 JPDA 构架下的多少个组成都部队分,JDWP 和 JDI 都相比小,首要的干活得以让虚拟机自身完毕。

从灵活性上,Java 调节和测试工具是创建在强硬的虚拟机上的,因而,很多前方的施用,比如动态编写翻译运维,字节码的实时替换等等,都能够透过对虚拟机的改正而收获贯彻。随着虚拟机技术的逐年前行和深深,各类不一样连串,不一致应用领域中虚拟机的出现,各样强大的作用的加盟,给我们的调节和测试工具也带来很多新的利用。

一言以蔽之,八个原生态的,可控的运维态给 Java 的调剂工作,给 Java 调节和测试接口带来了庞大的优势和惠及。通过 JPDA 这些专业,我们能够从虚拟机中拿走我们所急需的新闻,完毕大家所企望的操作,更好地开发大家的顺序。

 

7.2.1.1.1. 图 2. JPDA 模块层次

亿万先生: 2

当然,开发职员完全能够不应用完全的八个层次,而是依照个中的某3个层次开发自身的接纳。比如您完全能够单独正视通过 JVMTI 函数开发三个调节和测试工具,而不选拔 JDWP 和 JDI,只使用自身的简报和下令接口。当然,除非是有特有的急需,利用已有的落成会使你一石二鸟,防止重新发明轮子。

那八个模块咱们会在此起彼伏小说中分别详细介绍,那里大家简要介绍它们的最首要意义:

 

7.2. JPDA 组成模块

JPDA 定义了一个全体独立的系列,它由八个相对独立的层次共同整合,而且规定了它们三者之间的交互格局,可能说定义了它们通讯的接口。那多个层次由低到高分别是 Java 虚拟机工具接口(JVMTI),Java 调节和测试线协议(JDWP)以及 Java 调节和测试接口(JDI)。那七个模块把调节和测试进程分解成多少个很自然的定义:调节和测试者(debugger)和被调节和测试者(debuggee),以及她们在那之中的通讯器。被调节和测试者运行于我们想调节和测试的 Java 虚拟机之上,它可以通过 JVMTI 那个标准接口,监控当前虚拟机的新闻;调节和测试者定义了用户可采用的调剂接口,通过这一个接口,用户能够对被调剂虚拟机发送调节和测试命令,同时调节和测试者接受并出示调节和测试结果。在调节和测试者和被调剂着之间,调节和测试命令和调剂结果,都以透过 JDWP 的简报业协会议传输的。全数的指令被封装成 JDWP 命令包,通过传输层发送给被调节和测试者,被调节和测试者接收到 JDWP 命令包后,解析那一个命令并转化为 JVMTI 的调用,在被调节和测试者上运营。类似的,JVMTI 的运作结果,被格式化成 JDWP 数据包,发送给调节和测试者并再次回到给 JDI 调用。而调节和测试器开发人士正是通过 JDI 获得数码,发出指令。图 2 彰显了这么些历程:

7.3. JVMTI 的简介

JVMTI(JVM Tool Interface)是 Java 虚拟机所提供的 native 编程接口,是 JVMPI(Java Virtual Machine Profiler Interface)和 JVMDI(Java Virtual Machine Debug Interface)的革新版本。从这几个 API 的进化历史轨迹中我们就足以知道,JVMTI 提供了可用以 debug 和 profiler 的接口;同时,在 Java 5/6 中,虚拟机接口也加进了监听(Monitoring),线程分析(Thread analysis)以及覆盖率分析(Coverage Analysis)等效果。便是出于 JVMTI 的强有力功能,它是促成 Java 调节和测试器,以及其它 Java 运营态测试与分析工具的根基。

JVMTI 并不一定在具备的 Java 虚拟机上都有落到实处,分化的虚拟机的兑现也大有径庭。但是在一部分主流的虚拟机中,比如 Sun 和 IBM,以及一些开源的如 Apache Harmony D卡宴LVM 中,都提供了专业 JVMTI 实现。

JVMTI 是一套本地代码接口,因而选取 JVMTI 须求大家与 C/C++ 以及 JNI 打交道。事实上,开发时相似选择建立贰个 Agent 的方法来选拔 JVMTI,它利用 JVMTI 函数,设置有个别回调函数,并从 Java 虚拟机中得到当前的运转态音信,并作出自身的判定,最终还或然操作虚拟机的运行态。把 Agent 编写翻译成多个动态链接库之后,我们就足以在 Java 程序运维的时候来加载它(运营加载形式),也得以在 Java 5 之后选取运转时加载(活动加载格局)。

· -agentlib:agent-lib-name=options

· -agentpath:path-to-agent=options

 

 

7.2.1.1.1. 图 2. JPDA 模块层次

理所当然,开发职员完全能够不行使完整的八个层次,而是基于在那之中的某2个层次开发本身的利用。比如你完全能够唯有正视通过 JVMTI 函数开发二个调节工具,而不利用 JDWP 和 JDI,只行使自身的报纸发表和指令接口。当然,除非是有异乎常常的供给,利用已某些落成会使你一石两鸟,幸免双重发明轮子。

那八个模块大家会在继承小说中分别详细介绍,那里大家简要介绍它们的第1/8效:

 

7.4. Agent 的办事进度

7.3. JVMTI 的简介

JVMTI(JVM Tool Interface)是 Java 虚拟机所提供的 native 编制程序接口,是 JVMPI(Java Virtual Machine Profiler Interface)和 JVMDI(Java Virtual Machine Debug Interface)的翻新版本。从这几个 API 的开拓进取历史轨迹中大家就足以领略,JVMTI 提供了可用以 debug 和 profiler 的接口;同时,在 Java 5/6 中,虚拟机接口也加进了监听(Monitoring),线程分析(Thread analysis)以及覆盖率分析(Coverage Analysis)等效果。正是出于 JVMTI 的强有力功用,它是兑现 Java 调节和测试器,以及其余 Java 运营态测试与分析工具的功底。

JVMTI 并不一定在具备的 Java 虚拟机上都有落到实处,不一样的虚拟机的贯彻也有差别。不过在一部分主流的虚拟机中,比如 Sun 和 IBM,以及一些开源的如 Apache Harmony DCR-VLVM 中,都提供了行业内部 JVMTI 落成。

JVMTI 是一套本地代码接口,因而使用 JVMTI 须要大家与 C/C++ 以及 JNI 打交道。事实上,开发时一般采取建立三个 Agent 的艺术来使用 JVMTI,它使用 JVMTI 函数,设置某些回调函数,并从 Java 虚拟机中收获当前的运转态消息,并作出自个儿的论断,最终还大概操作虚拟机的运营态。把 Agent 编写翻译成二个动态链接库之后,大家就能够在 Java 程序运转的时候来加载它(运营加载形式),也足以在 Java 5 之后采取运维时加载(活动加载形式)。

· -agentlib:agent-lib-name=options

· -agentpath:path-to-agent=options

 

 

7.4.1. 启动

Agent 是在 Java 虚拟机运转之时加载的,那几个加载处于虚拟机起初化的早期,在那一个日子点上:

· 全数的 Java 类都未被发轫化;

· 全体的对象实例都未被创设;

· 因此,没有其他 Java 代码被实践;

但在这一个时候,大家曾经得以:

· 操作 JVMTI 的 Capability 参数;

· 使用系统参数;

动态库被加载之后,虚拟机会先物色二个 Agent 入口函数:

JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *vm, char *options, void *reserved)

在那一个函数中,虚拟机传入了1个 JavaVM 指针,以及命令行的参数。通过 JavaVM,大家能够拿走 JVMTI 的指针,并得到 JVMTI 函数的选择能力,全部的 JVMTI 函数都经过这些 jvmtiEnv 获取,不一致的虚拟机落成提供的函数细节可能分裂,不过使用的章程是联合的。

jvmtiEnv *jvmti; 

(*jvm)->GetEnv(jvm, &jvmti, JVMTI_VERSION_

7.4. Agent 的劳作经过

7.5. JVMTI 基本功能

JVMTI 的效能拾贰分丰盛,包蕴了虚拟机中线程、内部存款和储蓄器 / 堆 / 栈,类 / 方法 / 变量,事件 / 定时器处理等等 20 多类成效,上面大家介绍一下,并举一些粗略列子。

7.4.1. 启动

Agent 是在 Java 虚拟机运行之时加载的,那几个加载处于虚拟机早先化的最初,在那一个时间点上:

· 全数的 Java 类都未被伊始化;

· 全部的对象实例都未被创立;

· 因此,没有其他 Java 代码被实施;

但在这一个时候,大家曾经得以:

· 操作 JVMTI 的 Capability 参数;

· 使用系统参数;

动态库被加载之后,虚拟机会先物色贰个 Agent 入口函数:

JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *vm, char *options, void *reserved)

在这些函数中,虚拟机传入了一个 JavaVM 指针,以及命令行的参数。通过 JavaVM,我们可以取得 JVMTI 的指针,并得到 JVMTI 函数的应用力量,全体的 JVMTI 函数都经过这么些 jvmtiEnv 获取,差别的虚拟机实现提供的函数细节只怕分化,可是使用的主意是统一的。

jvmtiEnv *jvmti; 

(*jvm)->GetEnv(jvm, &jvmti, JVMTI_VERSION_

7.5.1. 事件处理和回调函数

从上文大家清楚,使用 JVMTI 1个着力的点子正是安装回调函数,在有个别事件时有发生的时候接触并作出相应的动作。因而这一某个的功效格外基本,当前版本的 JVMTI 提供了过多风浪(伊夫nt)的回调,包罗虚拟机开始化、开首运营、截至,类的加载,方法出入,线程始末等等。借使想对这个事件进行拍卖,大家必要首先为该事件写四个函数,然后在 jvmti伊夫ntCallbacks 这几个结构中内定相应的函数指针。比如,我们对线程运营感兴趣,并写了叁个 HandleThreadStart 函数,那么大家须求在 Agent_OnLoad 函数里进入:

 

7.5. JVMTI 基本作用

JVMTI 的功效万分丰盛,包罗了虚拟机中线程、内部存款和储蓄器 / 堆 / 栈,类 / 方法 / 变量,事件 / 定时器处理等等 20 多类功能,上边我们介绍一下,并举一些差不多列子。

7.5.2. 内部存款和储蓄器控制和目的获得

内部存款和储蓄器控制是成套运营态的基本效用。 JVMTI 除了提供最简便的内部存款和储蓄器申请和收回之外(那块内部存款和储蓄器不受 Java 堆管理,开发人士要求活动进行清理工科作,不然会造成内存泄漏),也提供了对 Java 堆的操作。家谕户晓,Java 堆中贮存了 Java 的类、对象和骨干项目(Primitive),通过对堆的操作,开发人士能够很简单的搜寻任意的类、对象,甚至足以强行推行垃圾收集工作。 JVMTI 中对 Java 堆的操作尤其,它从不提供二个平素得到的点子(简而言之,虚拟机对目标的管制并非是哈希表,而是某种树 / 图格局),而是使用二个迭代器(iterater)的法门遍历:

7.5.1. 事件处理和回调函数

从上文大家领悟,使用 JVMTI 两个主干的章程正是设置回调函数,在一些事件发生的时候接触并作出相应的动作。由此这一部分的效应十三分基本,当前版本的 JVMTI 提供了无数事件(Event)的回调,包罗虚拟机伊始化、初叶运营、甘休,类的加载,方法出入,线程始末等等。假诺想对那么些事件展开处理,我们供给首先为该事件写二个函数,然后在 jvmti伊芙ntCallbacks 这些布局中钦命相应的函数指针。比如,我们对线程运维感兴趣,并写了贰个 HandleThreadStart 函数,那么我们须要在 Agent_OnLoad 函数里插手:

 

7.5.3. 线程和锁

线程是 Java 运营态中越发首要的一个片段,在 JVMTI 中也提供了很多 API 进行对应的操作,包罗查询当前线程状态,暂停,复苏或然极端线程,仍是能够对线程锁举行操作。开发者能够获得一定线程所独具的锁:

jvmtiError GetOwnedMonitorInfo(jvmtiEnv* env, 

    jthread thread, 

    jint* owned_monitor_count_ptr, 

    jobject** owned_monitors_ptr)

也能够获取当前线程正在守候的锁:

jvmtiError GetCurrentContendedMonitor(jvmtiEnv* env, 

    jthread thread, 

    jobject* monitor_ptr)

 

7.5.2. 内部存储器控制和目的获得

内部存储器控制是全方位运营态的基本成效。 JVMTI 除了提供最简单易行的内部存款和储蓄器申请和注销之外(那块内部存款和储蓄器不受 Java 堆管理,开发职员必要活动开始展览清理工科作,不然会招致内部存款和储蓄器泄漏),也提供了对 Java 堆的操作。深入人心,Java 堆中蕴藏了 Java 的类、对象和中坚类型(Primitive),通过对堆的操作,开发职员能够很简单的搜索任意的类、对象,甚至能够强行推行垃圾收集工作。 JVMTI 中对 Java 堆的操作十二分,它从不提供三个一贯获得的法子(总而言之,虚拟机对目的的田管并非是哈希表,而是某种树 / 图格局),而是利用2个迭代器(iterater)的法门遍历:

7.5.4. 调剂效用

调剂效能是 JVMTI 的基本功效之一,那至关主要包含了安装断点、调节和测试(step)等,在 JVMTI 里面,设置断点的 API 自个儿很简短:

jvmtiError SetBreakpoint(jvmtiEnv* env, 

    jmethodID method, 

    jlocation location)

 

7.5.3. 线程和锁

线程是 Java 运营态中那么些首要的1个片段,在 JVMTI 中也提供了众多 API 实行对应的操作,包蕴查询当前线程状态,暂停,恢复或然极端线程,还能对线程锁举办操作。开发者能够拿走一定线程所拥有的锁:

jvmtiError GetOwnedMonitorInfo(jvmtiEnv* env, 

    jthread thread, 

    jint* owned_monitor_count_ptr, 

    jobject** owned_monitors_ptr)

也足以收获当前线程正在等候的锁:

jvmtiError GetCurrentContendedMonitor(jvmtiEnv* env, 

    jthread thread, 

    jobject* monitor_ptr)

 

7.6. 首要部分

7.5.4. 调剂成效

调剂功效是 JVMTI 的基本成效之一,那重庆大学包括了安装断点、调节和测试(step)等,在 JVMTI 里面,设置断点的 API 自己很不难:

jvmtiError SetBreakpoint(jvmtiEnv* env, 

    jmethodID method, 

    jlocation location)

 

7.6.1. Java 虚拟机工具接口(JVMTI)

JVMTI(Java Virtual Machine Tool Interface)即指 Java 虚拟机工具接口,它是一套由虚拟机直接提供的 native 接口,它地处整个 JPDA 种类的最底部,全数调节和测试功效本质上都需求通过 JVMTI 来提供。通过那些接口,开发人员不仅调节和测试在该虚拟机上运维的 Java 程序,仍是能够查看它们运转的气象,设置回调函数,控制有个别环境变量,从而优化程序质量。大家明白,JVMTI 的前身是 JVMDI 和 JVMPI,它们原来分别被用于提供调节和测试 Java 程序以及 Java 程序调节质量的功用。在 J2SE 5.0 之后 JDK 取代了 JVMDI 和 JVMPI 那两套接口,JVMDI 在风靡的 Java SE 6 中一度不提供帮忙,而 JVMPI 也安插在 Java SE 7 后被彻底取代。

7.6. 珍视部分

7.6.2. Java 调节和测试线协议(JDWP)

JDWP(Java Debug Wire Protocol)是3个为 Java 调节和测试而设计的贰个电视发表交互协议,它定义了调节和测试器和被调节和测试程序之间传递的新闻的格式。在 JPDA 连串中,作为前端(front-end)的调节和测试者(debugger)进度和后端(back-end)的被调节和测试程序(debuggee)进程之间的竞相数据的格式正是由 JDWP 来描述的,它详细完整地定义了请求命令、回应数据和错误代码,有限帮衬了前者和后端的 JVMTI 和 JDI 的通讯通畅。比如在 Sun 集团提供的完毕中,它提供了三个名为 jdwp.dll(jdwp.so)的动态链接库文件,这一个动态库文件落到实处了四个 Agent,它会负责解析前端发出的呼吁也许命令,并将其转会为 JVMTI 调用,然后将 JVMTI 函数的重临值封装成 JDWP 数据发还给后端。

其它,那里须要小心的是 JDWP 本人并不蕴涵传输层的落到实处,传输层须求单独完结,不过 JDWP 包蕴了和传输层交互的从严的概念,正是说,JDWP 共同商议纵然不鲜明大家是透过 EMS 依旧快递运输货物的,但是它规定了大家传递的货品的铺排的措施。在 Sun 公司提供的 JDK 中,在传输层上,它提供了 socket 格局,以及在 Windows 上的 shared memory 方式。当然,传输层本身只是正是本机内经过间通讯方式和远端通讯情势,用户有趣味也足以按 JDWP 的正式自个儿完成。

7.6.1. Java 虚拟机工具接口(JVMTI)

JVMTI(Java Virtual Machine Tool Interface)即指 Java 虚拟机工具接口,它是一套由虚拟机直接提供的 native 接口,它地处整个 JPDA 种类的最底部,全数调节和测试效能本质上都急需通过 JVMTI 来提供。通过那几个接口,开发职员不仅调试在该虚拟机上运营的 Java 程序,还是能够查看它们运转的事态,设置回调函数,控制有些环境变量,从而优化程序品质。大家了然,JVMTI 的前身是 JVMDI 和 JVMPI,它们原来分别被用来提供调节和测试 Java 程序以及 Java 程序调节质量的效能。在 J2SE 5.0 之后 JDK 取代了 JVMDI 和 JVMPI 那两套接口,JVMDI 在新式的 Java SE 6 中已经不提供支撑,而 JVMPI 也布署在 Java SE 7 后被彻底取代。

7.6.3. Java 调节和测试接口(JDI)

JDI(Java Debug Interface)是四个模块中最高层的接口,在大部分的 JDK 中,它是由 Java 语言实现的。 JDI 由针对前者定义的接口组成,通过它,调节和测试工具开发人士就能通过前端虚拟机上的调节和测试器来远程操控后端虚拟机上被调节和测试程序的运作,JDI 不仅能支持开发职员格式化 JDWP 数据,而且还可以为 JDWP 数据传输提供队列、缓存等优化服务。从理论上说,开发职员只需利用 JDWP 和 JVMTI 即可帮衬跨平台的中距离调节和测试,不过一贯编写 JDWP 程序费时步履蹒跚,而且功能不高。因而依据 Java 的 JDI 层的引入,简化了操作,进步了开发职员开发调节和测试程序的作用。

表 1 总计了多少个模块的分化点:

7.6.2. Java 调试线协议(JDWP)

JDWP(Java Debug Wire Protocol)是一个为 Java 调节和测试而设计的三个电视发表交互协议,它定义了调试器和被调节和测试程序之间传递的音讯的格式。在 JPDA 体系中,作为前端(front-end)的调节和测试者(debugger)进程和后端(back-end)的被调节和测试程序(debuggee)进度之间的互相数据的格式便是由 JDWP 来讲述的,它详细完整地定义了请求命令、回应数据和错误代码,保障了前者和后端的 JVMTI 和 JDI 的通讯通畅。比如在 Sun 公司提供的贯彻中,它提供了一个名为 jdwp.dll(jdwp.so)的动态链接库文件,这些动态库文件落实了3个 Agent,它会负责解析前端发出的伸手大概命令,并将其转会为 JVMTI 调用,然后将 JVMTI 函数的再次来到值封装成 JDWP 数据发还给后端。

此外,那里需求注意的是 JDWP 自个儿并不包涵传输层的兑现,传输层必要独自落成,但是 JDWP 包蕴了和传输层交互的残忍的概念,正是说,JDWP 协和式飞机尽管不明确大家是通过 EMS 如故快递运输商品的,不过它规定了咱们传递的货色的安放的方法。在 Sun 公司提供的 JDK 中,在传输层上,它提供了 socket 情势,以及在 Windows 上的 shared memory 方式。当然,传输层本人只是便是本机内经过间通讯格局和远端通讯形式,用户有趣味也能够按 JDWP 的规范本身达成。

7.6.3.1.1. 表 1. JPDA 层次比较

 

模块

层次

编程语言

作用

JVMTI

底层

C

获取及控制当前虚拟机状态

JDWP

中介层

C

定义 JVMTI 和 JDI 交互的数据格式

JDI

高层

Java

提供 Java API 来远程控制被调试虚拟机

 

 

7.6.3. Java 调节和测试接口(JDI)

JDI(Java Debug Interface)是多个模块中最高层的接口,在超过四分之一的 JDK 中,它是由 Java 语言完毕的。 JDI 由针对前者定义的接口组成,通过它,调节和测试工具开发人士就能经过前端虚拟机上的调节和测试器来远程操控后端虚拟机上被调节和测试程序的运作,JDI 不仅能扶助开发人士格式化 JDWP 数据,而且仍是能够为 JDWP 数据传输提供队列、缓存等优化服务。从理论上说,开发职员只需利用 JDWP 和 JVMTI 即可扶助跨平台的中远距离调节和测试,然则平素编写 JDWP 程序费时左右为难,而且效用不高。由此遵照 Java 的 JDI 层的引入,简化了操作,进步了开发人士开发调节和测试程序的功效。

表 1 总括了三个模块的差别点:

8. 找到源码

   this.m_jTotalEuros = new JLabel();

    this.m_jLblTotalEuros1 = new JLabel();

this.m_jSubtotalEuros = new JLabel();

 

 

参考

深远 Java 调节和测试种类,第 2 局地  JVMTI 和 Agent 完结.htm

JVMTI开发教程之2个归纳的Agent – 飞鸟Blog – 博客频道 – CSDN.NET.htm

JVM的动态agent机制 在main函数运营之后运转agent – CSDN博客.htm

JVM源码分析之javaagent原理完全解读.htm

 

7.6.3.1.1. 表 1. JPDA 层次相比较

模块

层次

编程语言

作用

JVMTI

底层

C

获取及控制当前虚拟机状态

JDWP

中介层

C

定义 JVMTI 和 JDI 交互的数据格式

JDI

高层

Java

提供 Java API 来远程控制被调试虚拟机

 

8. 找到源码

   this.m_jTotalEuros = new JLabel();

    this.m_jLblTotalEuros1 = new JLabel();

this.m_jSubtotalEuros = new JLabel();

 

 

参考

浓密 Java 调节和测试体系,第 2 有的  JVMTI 和 Agent 达成.htm

JVMTI开发教程之3个不难的Agent – 飞鸟Blog – 博客频道 – CSDN.NET.htm

JVM的动态agent机制 在main函数运转之后运转agent – CSDN博客.htm

JVM源码分析之javaagent原理完全解读.htm

相关文章

网站地图xml地图