使用java虚拟机工具接口创建调试和分析代理_第1页
使用java虚拟机工具接口创建调试和分析代理_第2页
使用java虚拟机工具接口创建调试和分析代理_第3页
使用java虚拟机工具接口创建调试和分析代理_第4页
使用java虚拟机工具接口创建调试和分析代理_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文阐述如何使用JVMTI创立Java应用程序的调试和分析工具。这种工具〔也称作代理〕在应用程序中发惹事件时,可以使用该接口提供的功能对事件通知进展注册,并查询和控制该应用程序。这里提供了JVMTI的文档资料。JVMTI代理对于调试和调优应用程序非常有用。它可以对应用程序的各个方面予以说明,如内存分配情况、CPU利用情况及锁争夺情况。尽管JVMPI如今仍处于实验阶段,很多Java技术开发人员已经在使用它了,而且已经把它应用到多种市场上提供的JaVa应用程序Profilero请注意,竭力鼓励开发人员使用JVMTI而不使用JVMPI。JVMPI在不久的将来将被废止。JVMTI在多个方面改进了JVMPI的功能和性能。例如:JVMTI依赖于每个事件的回调。这比JVMPI设计使用需要编组和取消编组的事件构造更有效。JVMTI包含四倍于JVMPI的函数〔包括用于获取关于变量、字段、方法和类的信息的更多函数〕。有关JVMTI函数的完好索引,请参见函数索引页。JVMTI比JVMPI提供更多类型的事件通知,包括异常事件、字段访问和修改事件、断点和单步骤事件等。有些从未被充分利用的JVMPI事件,如Arena的new和delete,或者通过字节码工具很容易就能获得的内容,或者JVMTI函数本身〔如heapdump和objectallocation〕往往被丢掉。对这些事件的描绘位于事件索引页。JVMTI是基于功能的,而JVMPI对于相应性能影响却是“要么全有,要么全无〞。JVMPI堆功能不可伸缩。JVMPI没有错误返回信息。JVMPI在VM实现方面具有很强的侵入性,容易导致维护问题和性能受损。☆JVMPI是个实验产品,不久将废止。在本文的以下部分,我们介绍一个简单代理,它使用JVMTI函数从Java应用程序提取信息。代理的编写必须使用本地代码。这里给出的例如代理是使用C语言编写的。您可以于此下载完好的例如代理代码。下面几段介绍如何初始化一个代理,以及代理如何使用JVMTI函数提取关于Java应用程序的信息,以及如何编译和运行代理。此例如代码和编译步骤特定于UNIX环境,但是经过修改后也可用于WindOWs。这里介绍的代理可用于在任何JaVa应用程序中分析线程和确定JVM内存使用情况。这里包含一个用Java语言编写的简单程序,称作SimpleThread.java,并可从这里下载。我们使用ThreadSample.jaVa演示此代理的预期输出。JVMTI的功能很多,在此无法详述;但本文中的代码可以提供一个出发点,让您去开发符合自己特定需求的分析工具。代理初始化本节介绍用于初始化代理的代码。首先,代理必须包括jvmti.h文件,语句为#include。另外,代理必须包含一个名为Agent_OnLOad的函数,加载库时要调用这一函数。Agent_OnLOad函数用于在初始化JaVavirtualmachine(JVM)之前设置所需的功能。AgenJOnLoad签名如下所示:JNIEXPORTjintJNICALLAgent_OnLOad(JavaVM*jvm,char*OptiOns,vOid*reserved){/*WereturnJNI_OKtOsignifysuccess*/returnJNI_OK;}在我们的例如代码中,我们必须为将要使用的JVMTI函数和事件启用多种功能。一般情况下均需〔在某些情况下必须〕将这些功能添加到Agent_OnLOad函数中。有关每种函数或事件所需的功能的说明,参见Java虚拟机工具接口页。例如,要使用InterruptThread函数,can_signal_thread功能必须为true。我们把例如所需的全部功能都设置为true,然后使用AddCapabilities函数将它们添加到JVMTI环境中:staticjvmtiEnv*jvmti=NULL;staticjvmtiCapabilitiescapa;jvmtiErrOrerrOr;(void)memset(&capa,0,sizeof(jvmtiCapabilities));capa.can_signal_thread=1;capa.can_get_owned_monitor_info=1;capa.can_generate_method_entry_events=1;capa.can_generate_exception_events=1;capa.can_generate_vm_object_alloc_events=1;capa.can_tag_objects=1;error=(*jvmti)->AddCapabilities(jvmti,&capa);check_jvmti_error(jvmti,error,"UnabletogetnecessaryJVMTIcapabilities.");...止匕外,Agent_OnLoad函数通常用于注册事件通知。在此例如中,我们在使用SetEventNotificationMode函数的Agent_OnLoad中启用了多个事件,如VMInitializationEvent、VMDeathEvent和VMObjectAllocation,如下所示:error=(*jvmti)->SetEventNotificationMode(jvmti,JVMTI_ENABLE,JVMTI_EVENT_VM_INIT,(jthread)NULL);error=(*jvmti)->SetEventNotificationMode(jvmti,JVMTI_ENABLE,JVMTI_EVENT_VM_DEATH,(jthread)NULL);error=(*jvmti)->SetEventNotificationMode(jvmti,JVMTI_ENABLE,JVMTI_EVENT_VM_OBJECT_ALLOC,(jthread)NULL);check_jvmti_error(jvmti,error,"Cannotseteventnotification");...注意,在此例如中,NULL是作为第三个参数传递的,它可以全局地启用事件通知。假设需要,可以为某个特殊线程启用或禁用某些事件。我们为其注册的每个事件还都必须具有一个指定的回调函数,当该事件发生时将调用它。例如,假设一个Exception类型的JVMTIEvent发生,例如代理会将其发送到回调方法callbackException()中。使用jvmtiEventCallbacks构造和SetEventCallbacks函数可以完成此任务:jvmtiEventCallbackscallbacks;...(void)memset(&callbacks,0,sizeof(callbacks));callbacks.VMInit=&callbackVMInit;/*JVMTI_EVENT_VM_INIT*/callbacks.VMDeath=&callbackVMDeath;/*JVMTI_EVENT_VM_DEATH*/callbacks.Exception=&callbackException;/*JVMTI_EVENT_EXCEPTION*/callbacks.VMObjectAlloc=&callbackVMObjectAlloc;/*JVMTI_EVENT_VM_OBJECT_ALLOC*/error=(*jvmti)->SetEventCallbacks(jvmti,&callbacks,(jint)sizeof(callbacks));check_jvmti_error(jvmti,error,"Cannotsetjvmticallbacks");...我们还将设置一个全局代理数据区域以在整个代码中使用。/*Globalagentdatastructure*/typedefstruct{/*JVMTIEnvironment*/jvmtiEnv*jvmti;jbooleanvm_is_started;/*DataaccessLock*/jrawMonitorIDlock;}GlobalAgentData;staticGlobalAgentData*gdata;在Agent_OnLoad函数中,我们执行以下设置:/*SetupinitialglobalagentdataareaUseofstatic/externdatashouldbehandledcarefullyhere.Weneedtomakesurethatweareabletocleanupafterourselvessoanythingallocatedinthislibraryneedstobe

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论