JVMTI开发教程之一个简单的Agent

JVM TI是JDK提供的一套用于开发JVM监控, 问题定位与性能调优工具的通用编程接口(API)。
通过JVMTI,我们可以开发各式各样的JVMTI Agent。这个Agent的表现形式是一个以c/c++语言编写的动态共享库。

JVMTI Agent原理: Java启动或运行时,动态加载一个外部基于JVM TI编写的dynamic module到Java进程内,然后触发JVM源生线程Attach Listener来执行这个dynamic module的回调函数。在函数体内,你可以获取各种各样的VM级信息,注册感兴趣的VM事件,甚至控制VM的行为。

JVMTI从功能上大致可以分为4类:

  1. Heap
    获取所有类的信息,对象信息,对象引用关系,Full GC开始/结束,对象回收事件等。

  2. 线程与堆栈
    获取所有线程的信息,线程组信息,控制线程(start,suspend,resume,interrupt…), Thread Monitor(Lock),得到线程堆栈,控制出栈,方法强制返回,方法栈本地变量等。

  3. Class & Object & Method & Field 元信息
    class信息,符号表,方法表,redefine class(hotswap), retransform class,object信息,fields信息,method信息等。

  4. 工具类
    线程cpu消耗,classloader路径修改,系统属性获取等。

开发jvm ti agent,简单的来讲,就是开发一个c/c++的共享库。在windows下后缀是dll,Linux/unix下是so,mac下就是dylib。所以我们创建工程和编译环境的时候,记得以共享库(share library)的形式来构建。

JVMTI的启动方式
JVMTI有两种启动方式,第一种是随java进程启动时,自动载入共享库,下文简称方式A。另一种方式是,java运行时,通过attach api动态载入,下文简称方式B。

方式A的实现方式是通过在java启动时传递一个特殊的option,例子如下:

java -agentlib:= Sample
注意,这里的共享库路径是环境变量路径,例如 java -agentlib:foo=opt1,opt2,java启动时会从linux的LD_LIBRARY_PATH或windows的PATH环境变量定义的路径处装载foo.so或foo.dll,找不到则抛异常

java -agentpath:= Sample
这是以绝对路径的方式装载共享库,例如 java -agentpath:/home/admin/agentlib/foo.so=opt1,opt2

方式B的实现方式是通过attach api,这是一套纯java的api,它负责动态地将dynamic module attach到指定进程id的java进程内并触发回调。例子如下:

import java.io.IOException;
import com.sun.tools.attach.VirtualMachine;

public class VMAttacher {

public static void main(String[] args) throws Exception {
 // args[0]为java进程id
     VirtualMachine virtualMachine = com.sun.tools.attach.VirtualMachine.attach(args[0]);
     // args[1]为共享库路径,args[2]为传递给agent的参数
     virtualMachine.loadAgentPath(args[1], args[2]);
     virtualMachine.detach();
}

}
Attach API位于$JAVA_HOME/lib/tools.jar,所以在编译时,需要将这个jar放入classpath。例如

javac -cp $JAVA_HOME/lib/tools.jar VMAttacher.java

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值