首页  

javaagent机制     所属分类 javaagent 浏览量 73
javaagent  探针
Instrumentation
attach


agent使用场景

class文件加密
性能监控(APM)
运行时错误监测及调试
调试(debug)
诊断(profile)
热加载



agent 的加载
jvm启动时加载
运行时 attach 

jstack

SignalDispatcher 和 Attach Listener 线程
jvm启动时 创建  SignalDispatcher 线程
只有接收过attach请求的才会创建 Attach Listener 线程

Attach机制 
A进程连上B进程(java进程),创建socket进行通信,A发命令给B,B返回信息给A

attach Listener 接收的指令

static AttachOperationFunctionInfo funcs[] = {  
  { "agentProperties",  get_agent_properties },  
  { "datadump",         data_dump },  
  { "dumpheap",         dump_heap },  
  { "load",             JvmtiExport::load_agent_library },  
  { "properties",       get_system_properties },  
  { "threaddump",       thread_dump },  
  { "inspectheap",      heap_inspection },  
  { "setflag",          set_flag },  
  { "printflag",        print_flag },  
  { "jcmd",             jcmd },  
  { NULL,               NULL }  
}; 

Instrumentation 主要使用load指令,让目标Jvm进行 动态加载agentlib

基于JVMTI接口实现   JVM Tool Interface

load时创建一个agent实例,并往JVMTI环境注册一些回调方法,比如监听类文件加载事件,vm初始化完成事件等

执行Agent_OnAttach,创建一个Instrumentation实例 , 可执行 transform  修改字节码等


vm初始化完成后调用 loadClassAndCallPremain 方法

该方法主要执行 agent  MF文件里定义的 Agent-Class类的premain方法

类加载时 调用 Instrumentation transform 方法 , 在类加载前修改字节码

JDK5开始,增加 JVM 参数 -javaagent ,在装载Class时对类进行动态的修改

ClassFileTransformer s_transformer = new ClassPreProcessorAgentAdapter();
public static void premain(String options, Instrumentation instrumentation) {
    instrumentation.addTransformer(s_transformer);
}


运行时 通过attach 来load agent
收到load指令之后,会调用InvocationAdapter.c的Agent_OnAttach方法
调用Agent-Class的 agentmain 方法


Java平台调试体系 JPDA(Java Platform Debugger Architecture)


 java agent 简单例子  
 java debug 原理简介  
 java类加载知识点  
 jvm外挂工具揭秘  

上一篇     下一篇
ETF投资指南

银华日利(511880) vs 华宝添益(511990)

java debug 原理简介

javaagent两种加载方式及实例

Java8日期api使用

jconsole连接jmx失败处理