Java Instrument有什么作用?

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

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

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

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

Java Instrument的实现是基于JVM什么机制?

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

Instrument premain、agentmain方法何时执行?

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

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

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

java.lang.instrument.ClassFileTransformer 什么作用?

ClassFileTransformer当中的transform方法可以对类定义进行操作修改;

在类字节码载入JVM前,JVM会调用ClassFileTransformer.transform方法,从而实现对类定义进行操作修改,实现AOP功能;相对于JDK 动态代理、CGLIB等AOP实现技术,不会生成新类,也不需要原类有接口;
7 对于agentmain方法执行,如何进行动态attach agent?
通过VirtualMachine附着一个Instrument,如:vm.loadAgent(jar);

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

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

两个核心API ClassFileTransformer、Instrumention?

ClassFileTransformer:定义了类加载前的预处理类;
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;

Java Instrument工作原理?

在JVM启动时,通过JVM参数-javaagent,传入agent jar,Instrument Agent被加载;
在Instrument Agent 初始化时,注册了JVMTI初始化函数eventHandlerVMinit;
在JVM启动时,会调用初始化函数eventHandlerVMinit,启动了Instrument Agent,用sun.instrument.instrumentationImpl类里的方法loadClassAndCallPremain方法去初始化Premain-Class指定类的premain方法;
初始化函数eventHandlerVMinit,注册了class解析的ClassFileLoadHook函数;
在解析Class之前,JVM调用JVMTI的ClassFileLoadHook函数,钩子函数调用sun.instrument.instrumentationImpl类里的transform方法,通过TransformerManager的transformer方法最终调用我们自定义的Transformer类的transform方法;
因为字节码在解析Class之前改的,直接使用修改后的字节码的数据流替代,最后进入Class解析,对整个Class解析无影响;
重新加载Class依然重新走5-6步骤;

Java面试快问快答-Instrument机制相关推荐

  1. Java面试题36题快问快答

    六六大顺,快问快答Java面试36问!我们从面试来反推Java学习. 少侠,少侠,今天我们来看Java面试题,从大厂梦反推基础学习. 面试题: JDK 和 JRE 有什么区别? final 在 jav ...

  2. 快问快答JS面向对象面试题

    1.说说你对闭包的理解 使用闭包主要是为了设计私有的方法和变量.闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露.在js中,函数即闭包,只有函数才 ...

  3. mysql数据库索引页号为什么从3开始_MySQL数据库快问快答

    原标题:MySQL数据库快问快答 前言 今天楼主给大家列一下关于数据库几个常见问题的要点,如果大家对其中的问题感兴趣,可以自行扩展研究. 1. UNION ALL 与 UNION 的区别 UNION和 ...

  4. Coremail归档系统2020快问快答

    在了解了邮件归档和邮件备份的区别之后,就有不少小伙伴在后台询问Coremail是否有配套的归档系统,具有又是怎么应用的?为了满足小伙伴们的求知欲,小编特意邀请喵教授对Coremail归档系统2020进 ...

  5. Flutter widgets 快问快答 | 第一期

    想打造精彩的 Flutter 应用,离不开对各种 widget 的熟练使用.Flutter widget 短视频系列已经在 B 站连载一段时间了,这里我们为大家带来近期观看最多的三个 widget 的 ...

  6. 陆奇博士演讲+现场创业快问快答,杭州、苏州、上海、深圳、武汉

    陆奇博士演讲+现场创业快问快答,杭州.苏州.上海.深圳.武汉 各位亲爱的创业者,奇绩创坛合伙人团队将会携手创业营往期校友,在北京.上海.深圳.苏州.杭州.武汉举办八场大型创业者见面会. 陆奇博士会为大 ...

  7. Java面试常问计算机网络问题

    转载自   Java面试常问计算机网络问题 一.GET 和 POST 的区别 GET请注意,查询字符串(名称/值对)是在 GET 请求的 URL 中发送的:/test/demo_form.asp?na ...

  8. Java 面试必问题目,Java 后端校招面试题

    字节跳动一面: 自我介绍,主要讲讲做了什么和擅长什么 看你项目做 Spring 比较多, 问一下 Spring 相关的东西, IoC 是什么概念? Bean 的默认作用范围是什么?其他的作用范围? 索 ...

  9. 指南Java面试常问问题及答案

    Java 面试常问问题及答案(非常详细) 一:java 基础 1.简述 string 对象,StringBuffer.StringBuilder 区分 string 是 final 的,内部用一个 f ...

  10. java面试常问知识点,快醒醒吧

    前言 今天这篇文章是比较偏"教程"一点的文章.但也由浅入深,认真地分析了源码,并且介绍了一些在使用Spring Cache中常见的问题和解决方案,肯定是比简单的入门文档更有深度一些 ...

最新文章

  1. linux单 网卡添加多个网段的ip,[转载]linux 单网卡来绑定多IP实现多网段访问以及多网卡绑定单IP实现附载均...
  2. 年度回顾:2018年的人工智能/机器学习惊喜及预测19年的走势
  3. C++知识点48——类继承与类的作用域
  4. Go使用go-clickhouse库
  5. .net数据源控件绑定mysql_理解asp.net中DropDownList编辑数据源,绑定数据库数据。...
  6. Android 10分钟集成极光推送
  7. LeetCode 1219. 黄金矿工(回溯)
  8. linux可以用dos命令是什么意思,Linux系统常用命令与DOS命令的类似之处和本质区别各是什么?...
  9. JavaScript知识点查阅
  10. Windows 10 再香,国内超一半用户「死守」停更的 Windows 7
  11. redisdemo php,一个简单的用redis做秒杀支撑的demo (PHP版)
  12. collections.OrderedDict()
  13. CodeProject SenseAI服务器:AI最简单的方法
  14. spark学习之资源调度
  15. “你打算怎么构建云安全资源池”
  16. 西南大学奥鹏教育计算机基础答案,西南大学网络与继续教育学院课程 1055《powerpoin…...
  17. 这2个在线资源网千万别错过,老司机人手一份,一年省下好几千
  18. 计算机网络(六):链路层
  19. 无线LED智能照明控制系统
  20. ajax请求生命周期方法

热门文章

  1. 图片服务器-存储图片技巧
  2. 陈强教授《机器学习及R应用》课程 第十五章作业
  3. 浅谈运营商行业业务的发展方向
  4. 【NOI2015】bzoj4199 品酒大会【解法一】
  5. 后盾网php微博系统,后盾网ThinkPHP微博项目开发视频教程 - 轻松自学网
  6. 仿“当当网”首页-Flash图片轮换
  7. html语言 搜索引擎关键词 怎么写,HTML关键词
  8. 智课雅思词汇---二十、前缀syn-sym-syl是什么意思
  9. 计算机软件工程课程设计感想,软件课程设计心得体会.docx
  10. 【工具笔记】java 中文替换,用于简单的中文替换脱敏加密,且保留模糊查询特性