javaagent机制
所属分类 javaagent
浏览量 1592
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失败处理