0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Java Agent的作用及原理

科技绿洲 来源:Java技术指北 作者:Java技术指北 2023-10-10 15:53 次阅读

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的监测分析。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2967

    浏览量

    104740
  • 编程
    +关注

    关注

    88

    文章

    3615

    浏览量

    93715
  • 代码
    +关注

    关注

    30

    文章

    4787

    浏览量

    68569
  • Agent
    +关注

    关注

    0

    文章

    105

    浏览量

    26739
  • JVM
    JVM
    +关注

    关注

    0

    文章

    158

    浏览量

    12223
收藏 人收藏

    评论

    相关推荐

    Java泛型的背景和作用

    Java泛型的背景和作用 Java泛型是Java编程语言中的一个特性,引入泛型的目的是为了增强代码的类型安全性和重用性。在没有泛型之前,Java
    的头像 发表于 09-20 14:30 1081次阅读
    <b class='flag-5'>Java</b>泛型的背景和<b class='flag-5'>作用</b>

    [10.3.4]--3.智能Agent技术-应用与平台

    Agent
    学习电子知识
    发布于 :2022年11月23日 16:16:57

    如何实现User-Agent

    `最近在玩儿Labview做浏览器,发现个问题。首先默认浏览器是IE6的内核,用倒是能用,但是现在很多站点已经不支持了。所以会弹出对话框:所以想用User-Agent伪装成别的浏览器,这个如何实现?试了在调用节点的Header里面写User-Agent,然并卵,并没有任何
    发表于 09-12 16:02

    轻量级Agent平台怎么测试?

    Agent系统一直没有应用到嵌入式设备上。这是由于没有合适的Agent平台能够适应于软、硬件资源受到限制的嵌入式系统。KVM (Kilo-bytes Virtual Machine)的出现,使JAVA这种
    发表于 09-27 06:26

    树莓派如何开发Agent

    ,配置了JADE(基于javaAgent开发框架)。各项测试都正常,但是使用两台树莓派(都配置了JADE)进行远程Agent之间的通信测试时,一直提示通信失败。在尝试了各种办法(包括更改树莓派主机名、固定IP地址、禁用IPV6
    发表于 05-18 05:56

    Java变量/标识符的作用及注意事项是什么?

    Java变量的作用/使用及注意事项Java标识符的作用/使用及注意事项
    发表于 11-04 06:29

    基于使命的Agent组织模型

    Agent组织是一种灵活有效的多Agent系统求解方式。针对目前Agent组织模型主要以利己型Agent为基础的现状,提出适合政府及军事等领域使用的基于使命的
    发表于 04-10 08:46 6次下载

    基于Agent的机线资源管理系统的设计

    Agent是一种在分布式系统中能自主地发挥作用的计算实体,它具有自己的知识、目标和能力。本文提出利用多Agent系统设计机线资源管理系统,将机线资源的管理内容分解成一个个Agent,
    发表于 05-26 16:25 12次下载

    嵌入式轻量Agent平台的构建研究

            根据轻量Agent 平台特性以及运行方式,提出了软件Agent 运行的改进方案。采用开发嵌入式系统和移动设备的JAVA 版本—J2ME,在基于
    发表于 09-11 09:15 13次下载

    Agent技术研究与分析

    介绍了 Agent 和多Agent技术的背景和概念,比较了Agent系统和多Agent系统的体系结构,着重分析了Agent的结构,说明了多
    发表于 06-08 16:03 0次下载
    <b class='flag-5'>Agent</b>技术研究与分析

    关于Java变量的作用域分析

    目录 1.静态作用域与动态作用域 2.变量的作用域 3.Java 中变量的作用域 4.Java
    发表于 09-25 16:28 0次下载

    Java中bean的作用

    java开发者都会在实体对象的属性中加上private关键字,而在业务类对外发放的方法中写上public关键字,这并不是习惯,而是开发者深谙其道,这就是java对象中filed的作用域。 举个
    发表于 09-25 16:36 0次下载
    <b class='flag-5'>Java</b>中bean的<b class='flag-5'>作用</b>域

    DongTai-agent-java洞态IAST的Java应用探针

    DongTai-agent-java.zip
    发表于 05-06 11:14 1次下载
    DongTai-<b class='flag-5'>agent-java</b>洞态IAST的<b class='flag-5'>Java</b>应用探针

    java-hot-reload-agent java热更新插件

    ./oschina_soft/gitee-java-hot-reload-agent.zip
    发表于 06-14 09:26 2次下载
    <b class='flag-5'>java-hot-reload-agent</b> <b class='flag-5'>java</b>热更新插件

    技术速递 | Java Agent场景性能测试分析优化经验分享

    作者:栾文飞 高阶软件工程师 一、背景介绍 Sermant是一个主打服务治理领域的Java Agent框架,在服务治理中难免会有针对业务流量进行解析和处理的过程,此类服务治理能力将会对微服务的服务
    的头像 发表于 03-25 07:55 717次阅读