当前位置:   article > 正文

Java探针--javaagent--使用/实例

-javaagent

原文网址:Java探针--javaagent--使用/实例_IT利刃出鞘的博客-CSDN博客

技术星球

欢迎来到IT技术星球,网站是:learn.skyofit.com(或者百度直接搜:自学精灵)。内容有:Java学习路线、Java学习资料、Java入门实战项目、Java真实面试题Java设计模式实战、Shiro项目实战、Idea和Navicat的“魔法”教程、SpringBoot进阶、架构与微服务设计、高并发实战网站防御技术等。网站的定位:超高的质量、超高的真实性、超高的实用性。欢迎加入~

简介

本文用示例介绍javaagent的用法。

javaagent简介

JavaAgent 是JDK 1.5 以后引入的,也叫做Java代理。

javaagent的作用

  • 可以在加载java文件之前进行拦截,修改字节码。
  • 可以在运行期间修改已经加载的类的字节码。
    • 这种用法有很多的限制。
  • javaagent结合javassist功能更强大:可以创建类、方法、变量等。

这实际上提供了一种虚拟机级别的 AOP 实现方式。通过以上方法就能实现对一些框架或是技术的采集点进行字节码修改,完成这些功能:对应用进行监控,对执行指定方法或是接口时额外添加操作(打印日志、打印方法执行时间、采集方法的入参和结果等)。

很多APM监控系统就是基于此实现的,例如:Arthas、SkyWalking。

javaagent的使用方式

  • 方式1:在一个普通 Java 程序(带有 main 函数的 Java 类)运行时,通过 -javaagent 参数指定一个特定的 jar 文件(包含 Instrumentation 代理)来启动 Instrumentation 的代理程序。
    •  -javaagent 这个参数的个数是不限的,如果指定了多个,则会按指定的先后执行,执行完各个 agent 后,才会执行主程序的 main 方法。例如:
      java -javaagent:D:\workspace\javaagent.jar=hello1 -javaagent:D:\workspace\javaagent.jar=hello2 -jar D:\workspace\myTest.jar
  • 方式2:在一个普通 Java 程序(带有 main 函数的 Java 类)运行时,通过 Java Tool API 中的 attach 方式指定进程id和特定jar包地址,启动 Instrumentation 的代理程序。

javaagent其他的功能

  • 获取所有已经被加载过的类
  • 获取所有已经被初始化过了的类(执行过了clinit方法,是上面的一个子集)
  • 获取某个对象的大小
  • 将某个jar加入到bootstrapclasspath里作为高优先级被bootstrapClassloader加载
  • 将某个jar加入到classpath里供AppClassload去加载
  • 设置某些native方法的前缀,主要在查找native方法的时候做规则匹配

静态agent与动态agent

Agent分为如下两种:

  • 静态Instrument:在main加载之前运行的Agent
  • 动态Instrument:在main运行之后运行的Agent(JDK1.6以后提供)。

静态Instrument(启动时)加载Instrument过程

  1. 创建并初始化 JPLISAgent;
  2. 监听VMInit事件,在JVM初始化完成之后做下面的事情:
    1. 创建InstrumentationImpl对象;
    2. 监听ClassFileLoadHook事件;
    3. 调用InstrumentationImpl的loadClassAndCallPremain方法,在这个方法里会去调用javaagent中MANIFEST.MF里指定的Premain-Class类的premain方法 ;
  3. 解析javaagent中MANIFEST.MF文件的参数,并根据这些参数来设置JPLISAgent里的一些内容。

动态Instrument运行时加载Instrument过程

通过JVM的attach机制来请求目标JVM加载对应的agent,过程大致如下:

  1. 创建并初始化JPLISAgent;
  2. 解析 javaagent 里 MANIFEST.MF 里的参数;
  3. 创建 InstrumentationImpl 对象;
  4. 监听 ClassFileLoadHook 事件;
  5. 调用 InstrumentationImpl 的loadClassAndCallAgentmain方法,在这个方法里会去调用javaagent里 MANIFEST.MF 里指定的Agent-Class类的agentmain方法。
     

示例1:简单用法

agent程序

项目结构

1.提供premain方法

上边是文章的部分内容,为便于维护,全文已转移到此网址:Java探针-javaagent-使用/实例 - 自学精灵

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/349135
推荐阅读
相关标签
  

闽ICP备14008679号