JVM attach & ASM

ASM3.0指南翻译.pdf 下载

Sun JVM Attach API是Sun JVM中的一套非标准的可以连接到JVM上的API,从JDK6开始引入,除了Solaris平台的Sun JVM支持远程的Attach,在其他平台都只允许Attach到本地的JVM上。

一、Sun JVM Attach API功能上非常简单,仅提供了如下几个功能:

  • 列出当前所有的JVM实例描述(如JDK工具jps吗,列出所有的java进程的pid)
  • Attach到其中一个JVM上,建立通信管道
  • 让目标JVM加载Agent

Java Instrutment

Java Instrutment提供了: 一个是允许在类加载之前,修改类字节(ClassFileTransformer)(JDK5中开始提供,即使随JVM启动的Agent),另外一个是在类加载之后,触发JVM重新进行类加载(JDK6中开始提供,用于JVM启动之后通过Attach去加载Agent)。Visual VM的性能剖析、JConsole支持Attach到进程上进行监控,都是通过这种方式来做的。除了这两个功能外,JDK 6中还提供了动态增加BootstrapClassLoader/SystemClassLoader的搜索路径、对Native方法进行instrutment。

asm提供了一个eclipse plugin,更新地址为:http://andrei.gmxhome.de/eclipse/

它可以对比出修改前后的class的差异,并自动翻译为asm代码

btrace:

是一款就能在不改动当前程序的情况下,运行时的去监控Java程序的执行状况,例如可以做到内存状况的监控、方法调用的监控等等。实现机制是attach api + asm + instrumentation。Java Instrutment一个是允许在类加载之前,修改类字节,从JDK5中开始提供,随JVM启动的Agent,另外一个是在类加载之后,触发JVM重新进行类加载,JDK6中开始提供,用于JVM启动之后通过Attach去加载Agent。

转载请注明:运维派 » JVM attach & ASM

0
3.0k
2
  1. Oracle也有ASM这个概念,刚在网上查了下,这里的ASM原来是指一个Java字节码操纵框架,最好能介绍下ASM的应用场景和带来的好处,多谢Lin大侠了。

  2. 像Spring的AOP、Btrace工具等实际上都是封装了ASM来改写字节码实现动态注入,Java进程有2种Attach方式,一种是静态方式,用到-javaagent加载agent包,一种是动态attach,不需重启Java进程即可修改class,像JConsole工具连接到Java进程就是用的这种技术,当然还有JVMTI,它用C++写的动态库agent加载来做JVM监控。