`
Kingson_Wu
  • 浏览: 119485 次
文章分类
社区版块
存档分类
最新评论

Instumentation及相关工具

 
阅读更多

Instrumentation 实践详解
http://blog.csdn.net/kingson_wu/article/details/47282345
instrumentation 功能介绍(javaagent)
http://my.oschina.net/robinyao/blog/489767

Instrumentation就是javaagent的实现机制,说到Instrumentation,就必须想了解Java的attach机制
javaagent–>>Instrumentation–>>attach 机制

greys-anatomy

https://github.com/oldmanpushcart/greys-anatomy

BTrace

BTrace是SUN Kenai云计算开发平台下的一个开源项目。旨在为java提供安全可靠的动态跟踪分析工具。
Btrace基于动态字节码修改技术(Hotswap)来实现运行时java程序的跟踪和替换。
Btrace的脚本是用纯java编写的,基于一套官方提供的annotation,使跟踪逻辑实现起来异常简单。
Sun Attach API + BTrace脚本解析引擎 + Objectweb ASM + JDK6 Instumentation
1. Sun Attach API是充当动态加载 agent 的角色
2. BTrace解析引擎解析BTrace脚本
3. 解析完脚本后,Btrace会使用ASM将脚本里标注的类java.lang.Thread的字节码重写,植入跟踪代码或新的逻辑
4. 利用instrumentation的retransformClasses,将原始字节码替换掉

reference: BTrace实现原理的初步分析http://www.iteye.com/topic/483964

Sun Attach API


VirtualMachine vm = VirtualMachine.attach("1688"); // 1688是进程id
String agentJarPath = "E:\agent.jar"; // agent jar路径
vm.loadAgent(agentJarPath); // 加载agent

JVM Attach API ,JVM的 Attach有两种方式:
1. 指定javaagent参数 (premain方法)
2. 运行时动态attach(agentmain方法)

进行jstack的时候,经常看到两个线程Signal Dispatcher和 Attach Listener线程,这两个线程是实现attach的关键所在,其中前者是在jvm启动的时候就会创建的,后者只有接收过attach请求的时候vm才会创建,顾名思义,Signal Dispatcher是分发信号的, Attach Listener 是处理attach请求的,那么两者有什么关系呢,当我们执行attach方法的时候,会向目标vm发出一个SIGQUIT 的信号,目标vm收到这个信号之后就会创建Attach Listener线程了.
Attach机制说得简单点就是提供A进程可以连上B进程(当然是java进程),创建socket进行通信,A通过发命令给B,B然后对命令进行截取从自己的vm中获取信息发回给客户端vm.
Instrumentation的实现其实主要使用了load这个指令,它用来实现让target vm动态加载agentlib,Instrumentation的实现在一个名为libinstrument.dylib的动态lib库,linux下是libinstrument.so,它是基于jvmti接口实现的,因此在对其进行load的时候会创建一个agent实例….

reference: http://ivanzhangwb.github.io/btrace-vm-attach-api/


Java远程调试原理与运用:http://blog.csdn.net/hongchangfirst/article/details/44191925
Java远程调试的原理是两个VM之间通过debug协议进行通信,然后以达到远程调试的目的。两者之间可以通过socket进行通信。
首先被debug程序的虚拟机在启动时要开启debug模式,启动debug监听程序。jdwp是Java Debug Wire Protocol的缩写。

-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n zhc_application

zhc_application是main程序,server=y表示是监听其他debugclient端的请求。address=8000表示端口是8000
suspend表示是否在调试客户端建立连接之后启动 VM。如果为y,那么当前的VM就是suspend直到有debug client连接进来才开始执行程序。如果你的程序不是服务器监听模式并且很快就执行完毕的,那么可以选择在y来阻塞它的启动。

远程debug跟instrumentation貌似没啥关系。。。


VisualVM 是一款免费的性能分析工具。它通过 jvmstat、JMX、SA(Serviceability Agent)以及 Attach API 等多种方式从程序运行时获得实时数据,从而进行动态的性能分析。同时,它能自动选择更快更轻量级的技术尽量减少性能分析对应用程序造成的影响,提高性能分析的精度。


jprofiler Instumentation


Hotswap

Java:热部署,热加载,HotSwap
http://www.cppblog.com/biao/archive/2011/01/01/137845.html
HotSwap热加载,HotDeploy热部署
Java 类的热替换 —— 概念、设计与实现
http://www.ibm.com/developerworks/cn/java/j-lo-hotswapcls/
Java hotswap demo
http://download.csdn.net/detail/yellowxz/6331851
RJC401:HotSwap和JRebel——幕后的故事
http://article.yeeyan.org/view/213582/186226


-agentlib:<libname>[=<options>]
该参数是JDK5新引入的,用于虚拟机装载本地代理库。
-agentpath:<pathname>[=<options>]
设置虚拟机按全路径装载本地库,不再搜索PATH中的路径。其他功能和agentlib相同。
-javaagent:<jarpath>[=<options>]
虚拟机启动时装入java语言设备代理。Jarpath文件中的mainfest 文件必须有Agent-Class属性。代理类要实现public static void premain(String agentArgs, Instrumentation inst)方法。当虚拟机初始化时,将按代理类的说明顺序调用premain方法。

reference:
Java命令参数说明大全-java学习http://android.tgbus.com/java/tutorial/200901/174875.shtml

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics