2019独角兽企业重金招聘Python工程师标准>>>

Java Agent这个技术,对于大多数同学来说都比较陌生,但是多多少少又接触过,实际上,我们平时用的很多工具,都是基于Java Agent实现的,例如常见的热部署JRebel,各种线上诊断工具(btrace, greys),还有阿里最近开源的arthas。

其实Java Agent一点都不神秘,也是一个Jar包,只是启动方式和普通Jar包有所不同,对于普通的Jar包,通过指定类的main函数进行启动,但是Java Agent并不能单独启动,必须依附在一个Java应用程序运行,有点像寄生虫的感觉。

如何动手写一个Java Agent

因为Java Agent的特殊性,需要一些特殊的配置,在META-INF目录下创建MANIFEST文件.

并在MANIFEST文件中指定Agent的启动类

这里需要解释下为什么要指定 Agent-Class 和 Premain-Class ,在加载Java Agent之后,会找到 Agent-Class 或者 Premain-Class 指定的类,并运行对应的 agentmain 或者 premain 方法。

/*** 以vm参数的方式载入,在Java程序的main方法执行之前执行*/
public static void premain(String agentArgs, Instrumentation inst);/*** 以Attach的方式载入,在Java程序启动后执行*/
public static void agentmain(String agentArgs, Instrumentation inst);

如果不想手动创建MANIFEST文件,也可以通过Maven配置,在打包的时候自动生成,具体配置可以参数下面。

<plugin><artifactId>maven-assembly-plugin</artifactId><configuration><archive><manifestEntries><Premain-Class>com.dianping.rhino.agent.AgentBoot</Premain-Class><Agent-Class>com.dianping.rhino.agent.AgentBoot</Agent-Class><Can-Redefine-Classes>true</Can-Redefine-Classes><Can-Retransform-Classes>true</Can-Retransform-Classes></manifestEntries></archive></configuration>
</plugin>

所以,我们需要在 agentmain 或者 premain 方法中实现具体的Agent逻辑,这里是你大显身手的地方,读取JVM的各种数据,修改类的字节码,只要你能想到的,一般都可以实现。

如何加载 Java Agent

前面说了,一个Java Agent既可以在程序运行前加载,也可以在程序运行后加载,两者有什么区别呢?

程序运行前加载

通过JVM参数 -javaagent:**.jar 启动,程序启动的时候,会优先加载Java Agent,并执行其 premain 方法,这个时候,其实大部分的类都还没有被加载,这个时候可以实现对新加载的类进行字节码修改,但是如果 premain 方法执行失败或抛出异常,那么JVM会被中止,这是很致命的问题。

程序运行后加载

程序启动之后,通过某种特定的手段加载Java Agent,这个特定的手段就是 VirtualMachine的 attach api ,这个api其实是JVM进程之间的的沟通桥梁,底层通过socket进行通信,JVM A可以发送一些指令给JVM B,B收到指令之后,可以执行对应的逻辑,比如在命令行中经常使用的jstack、jcmd、jps等,很多都是基于这种机制实现的。

因为是进程间通信,所以使用 attach api 的也是一个独立的Java进程,下面是一个简单的实现。

// 15186表示目标进程的PID
VirtualMachine vm = VirtualMachine.attach("15186");
try {// 指定Java Agent的jar包路径vm.loadAgent(".../agent.jar");
} finally {vm.detach();
}

首先,我们得知道目标进程的PID,这个可以通过jps指令方便得到,也可以通过 VirtualMachine 的list方法拿到本机所有Java进程的PID。通过 attach 连接上目标PID之后,可以获得表示目标进程的vm对象,执行 loadAgent 方法,对应的Java Agent会被加载,然后会找到指定的入口类,并执行agentmain方法,如果执行出现普通异常(除了oom和其它致命异常),目标JVM并不会受到影响。

通过这种方式,可以实现动态的加载Java Agent,而不需要修改JVM启动参数。

转载于:https://my.oschina.net/u/3972077/blog/2253609

带你了解Java Agent相关推荐

  1. 一文带你了解Java Agent

    转载自  一文带你了解Java Agent Java Agent这个技术,对于大多数同学来说都比较陌生,像个黑盒子.但是多多少少又接触过,实际上,我们平时用的很多工具,都是基于Java Agent实现 ...

  2. Java Agent的隔离实现以及卸载时一些坑

    转载自   Java Agent的隔离实现以及卸载时一些坑 在<一文带你了解Java Agent>中,让大家了解了Java Agent的来龙去脉,当通过attach方式去动态加载一个Jav ...

  3. 写那么多年Java,还不知道啥是Java agent 的必须看一下!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者信息:张帅,花名洵澈,国际化中台事业部高级开发工程师,负责物流 ...

  4. 我的天,你工作5年了,连Java agent都不知道...

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 # 引言 在本篇文章中,我会通过几个简单的程序来说明 agent ...

  5. Java agent初探

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"加群"获取公众号专属群聊入口 来源:阿里巴巴中间件 在本篇文章中,我会通过几个简单的程 ...

  6. JVM插桩之二:Java agent基础原理

    Javaagent只要作用在class被加载之前对其加载,插入我们需要添加的字节码. Javaagent面向的是我们java程序员,而且agent都是用java编写的,不需要太多的c/c++编程基础, ...

  7. ssm如何支持热部署_Java 调式、热部署、JVM 背后的支持者 Java Agent

    我们平时写 Java Agent 的机会确实不多,也可以说几乎用不着.但其实我们一直在用它,而且接触的机会非常多.下面这些技术都使用了 Java Agent 技术,看一下你就知道为什么了. -各个 J ...

  8. java agent简介热部署SDK接入

    思考: 我们在平时使用arthas的类方法监控,类增强,到底是怎么在应用启动后还能对类进行修改的呢,他到底是基于什么场景下孕育出来的呢,今天我们就来聊一聊java-agent,当了解完了agent机制 ...

  9. Java Agent入门教程

    大家好,我是杨叔.每天进步一点点,关注微信公众号[程序员杨叔],了解更多测试开发技术知识! 一.什么是Java Agent Java agent本质上可以理解为一个插件,该插件就是一个精心提供的jar ...

  10. Java Agent:通灵之术

    1. 通灵之术 在<火影忍者>中,通灵之术,属于时空间忍术的一种. 那么,"通灵之术",在Java领域,代表什么意思呢?就是将正在运行的JVM当中的class进行导出. ...

最新文章

  1. 这才是GraphQL最详尽的解释
  2. iOS LaunchScreen和LaunchImage的转换启动图
  3. 基于Java的四大开源测试工具
  4. vs2013新建web项目异常 0x80070002 处理
  5. REVERSE-PRACTICE-CTFSHOW-2
  6. Oracle SQL性能优化40条,值得收藏
  7. git同时推送项目到GitHub和Gitee
  8. 小程序毕设作品之微信美食菜谱小程序毕业设计成品(6)开题答辩PPT
  9. 宽带运营商为什么限制上行带宽
  10. 讲解图层样式中的混合颜色带
  11. Hyper-v 实现与虚拟机共享文件夹
  12. 关于语言发育迟缓的孩子
  13. 点云配准方法原理(NDT、ICP)
  14. 从学会用橡皮鸭 debug 的那天,我,走上一条不归之路
  15. 分析《大话数据结构》
  16. 深度学习入门笔记(一):机器学习基础
  17. 将数据生成带图表的pdf,并下载
  18. 蓄电池各种内阻测试方法
  19. 会计学原理名词解释和简答
  20. 怎么找回电脑误删的文件方法汇总

热门文章

  1. Atitit 外出活动实名制条例sak令[2018]第920号 《外出活动实名制管理条例》     SAK安全部令 第920号 现发布《外出活动实名制管理条例》,自2018年9月1日起施行。
  2. Atitit 微服务之道 attilax著 1. 什么是微服务架构? 1 1.1. 、微服务与SOA的关系 :微服务架架构师面向服务架构(SOA)的一种特定实现 2 1.2. 微服务与康威定律 2 1
  3. Atitit.软件开发的几大规则,法则,与原则。。。attilax总结
  4. paip.python ide eric5-5.3.7 安装以及建立项目使用 最佳实践
  5. paip.提升用户体验---高性能web解决 c++ mycp 技术.
  6. 基金公司十大非货规模逆袭(2010-2020)
  7. 对话Man Group:对冲基金的达尔文式竞争
  8. (转)Python之区块链入门
  9. (转)美国:2016-2045新科技趋势报告
  10. 投资中的黑科技知多少?