当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:12:00  来源:本站整理

深化Java调试体系,第2部份: JVMTI和Agent实现[Java编程]

赞助商链接



  本文“深化Java调试体系,第2部份: JVMTI和Agent实现[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

JPDA(Java Platform Debugger Architecture)是 Java 平台调试体系构造的缩写.通过 JPDA 供应的 API,开辟人员可以便利机动的搭建 Java 调试利用程序. JPDA 主要由三个部份构成:Java 虚拟机工具接口(JVMTI)、Java 调试线协议(JDWP),以及 Java 调试接口(JDI).本系列将会具体介绍这三个模块的内部细节,并通过实例为读者揭开 JPDA 的面纱.

本系列的 第 1 部份 从整体上介绍 JPDA 的各个构成,以及它们彼此之间的内涵关联.本文是该系列的第 2 篇,将会侧重介绍强盛的虚拟机接口 - JVMTI,以及若何利用 JVMTI 编写用户自定义的 Java 调试和诊断程序.

Java 程序的诊断和调试

开辟人员对 Java 程序的诊断和调试有很多差别种类、差别层次的需求,这就使得开辟人员需求利用差别的工具来办理问题.比方,在 Java 程序运行的历程中,程序员但愿掌握它总体的运行情况,这个时刻程序员可以直接利用 JDK 供应的 jconsole 程序.假如但愿提高程序的履行效率,开辟人员可以利用各种 Java Profiler.这种范例的工具非常多,各有长处,可以帮忙开辟人员找到程序的瓶颈,从而提高程序的运行速度.开辟人员还会碰到一些与内存相关的问题,比方内存占用过量,大量内存不能得到释放,乃至招致内存溢出错误(OutOfMemoryError)等等,这时可以把当前的内存输出到 Dump 文件,再利用堆解析器大概 Dump 文件解析器等工具举行研究,查看当前运行态堆(Heap)中存在的实例整体情况来诊断问题.全部这些工具都有一个共同的特点,就是终究他们都需求通过和虚拟机举行交互,来发现 Java 程序运行的问题.

已有的这些工具固然强盛易用,但是在一些高级的利用环境中,开辟者常常会有一些特别的需求,这个时刻就需求定制工具来达成目标. JDK 本身定义了目标明确并功效完善的 API 来与虚拟机直接交互,并且这些 API 能很便利的举行扩大,从而满意开辟者各式的需求.在本文中,将对比具体地介绍 JVMTI,以及若何利用 JVMTI 编写一个定制的 Agent .

Agent
Agent 即 JVMTI 的客户端,它和履行 Java 程序的虚拟机运行在同一个进程上,因此普通他们的实现都很紧凑,他们普通由另一个独立的进程掌握,充当这个独立进程和当前虚拟机之间的中介,通过调用 JVMTI 供应的接口和虚拟机交互,负责获得并返回当前虚拟机的状况大概转发掌握号令.

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 DRLVM 中,都供应了尺度 JVMTI 实现.

JVMTI 是一套本地代码接口,因此利用 JVMTI 需求我们与 C/C++ 以及 JNI 打交道.事实上,开辟时普通采取成立一个 Agent 的方法来利用 JVMTI,它利用 JVMTI 函数,设置一些回调函数,并从 Java 虚拟机中得到当前的运行态信息,并作出自己的判断,最后还大概操作虚拟机的运行态.把 Agent 编译成一个动态链接库之后,我们便可以在 Java 程序启动的时刻来加载它(启动加载情势),也可以在 Java 5 之后利用运行时加载(活动加载情势).

-agentlib:agent-lib-name=options

-agentpath:path-to-agent=options

Agent 的工作历程

启动

Agent 是在 Java 虚拟机启动之时加载的,这个加载处于虚拟机初始化的早期,在这个时间点上:

全部的 Java 类都未被初始化;

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

因而,没有任何 Java 代码被履行;

但在这个时刻,我们已经可以:

操作 JVMTI 的 Capability 参数;


  以上是“深化Java调试体系,第2部份: JVMTI和Agent实现[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • 深化Java调试体系: 第1部份,JPDA体系概览
  • 深化Java调试体系,第2部份: JVMTI和Agent实现
  • <b>深化Java策划管理器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .