Java Agent的作用及原理

java agent是目前各种监测调试jvm的主要技术。eclipse,intellij,visual vm ,jconsole 等都依赖于此技术。相信你们的java 程序部署的时候肯定也会配置各种java agent相关的信息。下面给大家盘一盘java agent!
1 java agent的作用java agent是java.lang.instrument.instrumentation api的一部分,instrumentation 提供了修改字节码的机制。并且可以动态或者静态地完成。这意味着我们可以在不接触源程序代码的情况下,向程序中添加一些代码来改变程序。java agent有多种用途,如面向切面编程(aop),程序分析等。aop可以在不修改原有代码的情况下向程序提供日志记录或安全类似的功能。
我们也可以使用javaagent来操控字节码可以和其他的程序进行组合。在jvm的层面监听对象创建、垃圾回收,线程创建等
性能分析工具使用了大量java agent 在程序执行的时候分析jvm的一些参数指标。
2 java agent的原理agent类必须实现下面的方法,这个方法就是agent类的入口,类似于java 的main方法入口。
public static void premain(string agentargs, instrumentation inst)jvm初始化之后main方法执行之前premain方法会被调用,程序中可以有多个agent。每一个agent都是按照jvm初始化的顺序进行调用。如果上述 premain方法没有找到,那么jvm会调用他的重载方法。方法如下:
public static void premain(string agentargs)jvm 启动之后,可以通过attach去调用agentmain方法,许多动态的jvm参数分析都是通过这个方法来完成的。
public static void agentmain(string agentargs, instrumentation inst)同样的如果上述agentmain方法没有找到,那么也会执行其重载方法的版本。
public static void agentmain(string agentargs)下图为 openjdk11中的agent类:
3 一个自定义agent示例下面我们实现一个简单的java agent类来体验一下agent。
3.1 自定义agent类创建普通maven工程并新建agent启动类
public class javanorthagent { //jvm启动时的agent 方法 public static void premain(string agentargs, instrumentation inst) { system.out.println(premain --- agentargs: + agentargs + |inst: + inst.tostring()); } // jvm运行中的agent 方法 public static void agentmain(string agentargs, instrumentation inst){ system.out.println(agentmain --- agentargs: + agentargs + |inst: + inst.tostring()); }}3.2 将agent类打成jar包将上述自定义java agent 类打包到jar包中,增加maven build 参数如下
执行 mvn clean package命令打包后,可以看到taget目录下的jar包文件如下。
3.3 使用java命令使用指定的agent这里我们使用java命令行启动并使用我们自定义的java agent类
public class main { public static void main(string[] args) { javanorth(java north agent); } public static void javanorth(string message){ system.out.println(message); }}java -javaagent:e:javanorthjavanorthagenttargetjavanorthagent-1.0-snapshot.jar=hello javanorth com.javanorth.agent.main
输出结果如下:
总结本片简单介绍了java agent类的使用,并给出了一个简单的agent代码示例。其中visual vm ,jconsole 等工具会使用jdk自带的agent来实现实现jvm状态分析。同样arthas 和skywalking也是使用的agent的技术来实现对jvm的监测分析。

NEC推出36款用于低端车身控制的微控制器
可编程线性直流电源DP2000系列
科研型热成像仪飞础科287红外热像仪
区块链将如何彻底改变医学领域的许多数据挑战
UltraCMOS PE42020:业界第一个真正的直流射频开关,能够通过大功率
Java Agent的作用及原理
数美时代唐会军:创业就像马拉松长跑
Google Photos提出了一项新技术
互联网电视一地鸡毛 主要原因是忽视供应链
电脑免驱USB转串口解决方案
基于图像处理烤烟鲜烟叶含水率的诊断研究
2020机器人大赛即将在北京拉开帷幕
智能废物处理解决方案可助力实现循环经济
单片机设计产品的六大步骤说明
使用新的计算引擎(CE)代码图像编译仪表代码
企业上云一张网 华为将在分析师大会上亮出哪些大招
卖身在即?特斯拉押注中国市场
垃圾分类时代来临,如何选择一款实用的垃圾处理器?
JAE推出用于全尺寸SD卡座的SG50系列连接器
今年下半年有哪些CPU值得期待