带你了解Java Agent
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相关推荐
- 一文带你了解Java Agent
转载自 一文带你了解Java Agent Java Agent这个技术,对于大多数同学来说都比较陌生,像个黑盒子.但是多多少少又接触过,实际上,我们平时用的很多工具,都是基于Java Agent实现 ...
- Java Agent的隔离实现以及卸载时一些坑
转载自 Java Agent的隔离实现以及卸载时一些坑 在<一文带你了解Java Agent>中,让大家了解了Java Agent的来龙去脉,当通过attach方式去动态加载一个Jav ...
- 写那么多年Java,还不知道啥是Java agent 的必须看一下!
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者信息:张帅,花名洵澈,国际化中台事业部高级开发工程师,负责物流 ...
- 我的天,你工作5年了,连Java agent都不知道...
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 # 引言 在本篇文章中,我会通过几个简单的程序来说明 agent ...
- Java agent初探
点击上方"朱小厮的博客",选择"设为星标" 后台回复"加群"获取公众号专属群聊入口 来源:阿里巴巴中间件 在本篇文章中,我会通过几个简单的程 ...
- JVM插桩之二:Java agent基础原理
Javaagent只要作用在class被加载之前对其加载,插入我们需要添加的字节码. Javaagent面向的是我们java程序员,而且agent都是用java编写的,不需要太多的c/c++编程基础, ...
- ssm如何支持热部署_Java 调式、热部署、JVM 背后的支持者 Java Agent
我们平时写 Java Agent 的机会确实不多,也可以说几乎用不着.但其实我们一直在用它,而且接触的机会非常多.下面这些技术都使用了 Java Agent 技术,看一下你就知道为什么了. -各个 J ...
- java agent简介热部署SDK接入
思考: 我们在平时使用arthas的类方法监控,类增强,到底是怎么在应用启动后还能对类进行修改的呢,他到底是基于什么场景下孕育出来的呢,今天我们就来聊一聊java-agent,当了解完了agent机制 ...
- Java Agent入门教程
大家好,我是杨叔.每天进步一点点,关注微信公众号[程序员杨叔],了解更多测试开发技术知识! 一.什么是Java Agent Java agent本质上可以理解为一个插件,该插件就是一个精心提供的jar ...
- Java Agent:通灵之术
1. 通灵之术 在<火影忍者>中,通灵之术,属于时空间忍术的一种. 那么,"通灵之术",在Java领域,代表什么意思呢?就是将正在运行的JVM当中的class进行导出. ...
最新文章
- 这才是GraphQL最详尽的解释
- iOS LaunchScreen和LaunchImage的转换启动图
- 基于Java的四大开源测试工具
- vs2013新建web项目异常 0x80070002 处理
- REVERSE-PRACTICE-CTFSHOW-2
- Oracle SQL性能优化40条,值得收藏
- git同时推送项目到GitHub和Gitee
- 小程序毕设作品之微信美食菜谱小程序毕业设计成品(6)开题答辩PPT
- 宽带运营商为什么限制上行带宽
- 讲解图层样式中的混合颜色带
- Hyper-v 实现与虚拟机共享文件夹
- 关于语言发育迟缓的孩子
- 点云配准方法原理(NDT、ICP)
- 从学会用橡皮鸭 debug 的那天,我,走上一条不归之路
- 分析《大话数据结构》
- 深度学习入门笔记(一):机器学习基础
- 将数据生成带图表的pdf,并下载
- 蓄电池各种内阻测试方法
- 会计学原理名词解释和简答
- 怎么找回电脑误删的文件方法汇总
热门文章
- Atitit 外出活动实名制条例sak令[2018]第920号 《外出活动实名制管理条例》 SAK安全部令 第920号 现发布《外出活动实名制管理条例》,自2018年9月1日起施行。
- Atitit 微服务之道 attilax著 1. 什么是微服务架构?	1 1.1. 、微服务与SOA的关系 :微服务架架构师面向服务架构(SOA)的一种特定实现	2 1.2. 微服务与康威定律	2 1
- Atitit.软件开发的几大规则,法则,与原则。。。attilax总结
- paip.python ide eric5-5.3.7 安装以及建立项目使用 最佳实践
- paip.提升用户体验---高性能web解决 c++ mycp 技术.
- 基金公司十大非货规模逆袭(2010-2020)
- 对话Man Group:对冲基金的达尔文式竞争
- (转)Python之区块链入门
- (转)美国:2016-2045新科技趋势报告
- 投资中的黑科技知多少?