☆技术问答集锦(13)Java Instrument原理

1 Java Instrument能做什么?最大的作用?

  1. 使开发者可以构建一个独立于应用程序的代理程序Agent,用来监控和协助运行在JVM上的程序,更重要的是能够替换和修改某些类的定义;

  2. 最大的作用:可以实现一种虚拟机级别支持的AOP实现方式;

2 在JDK 1.5 、1.6中,Java Instrument做了哪些变动支持?

  1. JDK 1.5:支持静态Instrument,就是在JVM启动前静态设置Instrument;

  2. JDK 1.6:支持动态Instrument,就是在JVM启动后动态设置Instrument;支持本地代码Instrument;支持动态改变classpath;

3 Java Instrument的实现是基于JVM哪种机制?JVMTI是什么,可以做什么?

  1. 基于JVMTI代理程序;
  2. JVMTI:一套代理程序机制,为JVM相关工具提供的本地编程接口集合;
  3. JVMTI可以支持第三方工具程序以代理的方式连接和访问JVM,并利用JVMTI提供的丰富的编程接口,完成很多跟JVM相关的功能;

4 Instrument premain、agentmain方法执行时机?

  1. premain执行时机:在JVM启动时,初始化函数eventHandlerVMinit会调用sun.instrument.instrumentationImpl类的loadClassAndCallPremain方法去执行Premain-Class指定类的premain方法;
  2. agentmain执行时机:在JVM启动后,通过VirtualMachine附着一个Instrument,如:vm.loadAgent(jar),会调用sun.instrument.instrumentationImpl类的loadClassAndCallAgentmain方法去执行Agentmain-Class指定类的agentmain方法;

5 Instrument premain、agentmain方法中两个参数agentArgs、inst代表什么?分别会有什么作用?

  1. agentArgs:代理程序命令行中输入参数,随同“-javaagent”一起传入,与main函数不同的是,这个参数是一个字符串而不是一个字符串数组;
  2. inst:java.lang.instrument.Instrumentation实例,由JVM自动传入,集中了几乎所有功能方法,如:类操作、classpath操作等;

6 java.lang.instrument.ClassFileTransformer是什么,有什么作用?

  1. ClassFileTransformer当中的transform方法可以对类定义进行操作修改;
  2. 在类字节码载入JVM前,JVM会调用ClassFileTransformer.transform方法,从而实现对类定义进行操作修改,实现AOP功能;相对于JDK 动态代理、CGLIB等AOP实现技术,不会生成新类,也不需要原类有接口;

7 对于agentmain方法执行,如何进行动态attach agent?

通过VirtualMachine附着一个Instrument,如:vm.loadAgent(jar);

8 META-INF/MAINFEST.MF参数清单?

  1. Premain-Class:指定包含premain方法的类名;
  2. Agent-Class:指定包含agentmain方法的类名;
  3. Boot-Class-Path:指定引导类加载器搜索的路径列表。查找类的特点于平台的机制失败后,引导类加载器会搜索这些路径;
  4. Can-Redefine-Class:是否能重新定义此代理所需的类,默认为false;
  5. Can-Retransform-Class:是否能重新转换此代理所需的类,默认为false;
  6. Can-Set-Native-Method-Prefix:是否能设置此代理所需的本机方法前缀,默认值为false;

9 两个核心API ClassFileTransformer、Instrumention?

  1. ClassFileTransformer:定义了类加载前的预处理类;
  2. Instrumentation:增强器

(1)add/removeTransformer:添加/删除ClasFileTransformer;

(2)retransformerClasses:指定哪些类,在已加载的情况下,重新进行转换处理,即触发重新加载类定义;对于重新加载的类不能修改旧有的类声明,比如:不能增加属性、不能修改方法声明等;

(3)redefineClasses:指定哪些类,触发重新加载类定义,与上面不同的是不会重新进行转换处理,而是把处理结果bytecode直接给JVM;

(4)getAllLoadedClasses:获取当前已加载的Class集合;

(5)getInitiatedClasses:获取由某个特定ClassLoader加载的类定义;

(6)getObjectSize:获得一个对象占用的空间大小;

(7)appendToBootstrapClassLoaderSearch/appentToSystemClassLoaderSearch:增加BootstrapClassLoader/SystemClassLoader搜索路径;

(8)isNativeMethodPrefixSupported/SetNativeMethodPrefix:判断JVM是否支持拦截Native Method;

10 Java Instrument工作原理?

  1. 在JVM启动时,通过JVM参数-javaagent,传入agent jar,Instrument Agent被加载;
  2. 在Instrument Agent 初始化时,注册了JVMTI初始化函数eventHandlerVMinit;
  3. 在JVM启动时,会调用初始化函数eventHandlerVMinit,启动了Instrument Agent,用sun.instrument.instrumentationImpl类里的方法loadClassAndCallPremain方法去初始化Premain-Class指定类的premain方法;
  4. 初始化函数eventHandlerVMinit,注册了class解析的ClassFileLoadHook函数;
  5. 在解析Class之前,JVM调用JVMTI的ClassFileLoadHook函数,钩子函数调用sun.instrument.instrumentationImpl类里的transform方法,通过TransformerManager的transformer方法最终调用我们自定义的Transformer类的transform方法;
  6. 因为字节码在解析Class之前改的,直接使用修改后的字节码的数据流替代,最后进入Class解析,对整个Class解析无影响;
  7. 重新加载Class依然重新走5-6步骤;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容