首页 / Java / JDK1.6“新“特性Instrumentation之JavaAgent(推荐)

JDK1.6“新“特性Instrumentation之JavaAgent(推荐)

简介 Java Agent是在JDK1.5以后,我们可以使用…

简介

Java Agent是在JDK1.5以后,我们可以使用agent技术构建一个独立于应用程序的代理程序(即为Agent),用来协助监测、运行甚至替换其他JVM上的程序。使用它可以实现虚拟机级别的AOP功能。

Agent分为两种,一种是在主程序之前运行的Agent,一种是在主程序之后运行的Agent(前者的升级版,1.6以后提供)。

JavaAgent的作用Agent给我们程序带来的影响

JDK1.6“新“特性Instrumentation之JavaAgent(推荐)

使用Agent-premain方法影响的程序效果图

JDK1.6“新“特性Instrumentation之JavaAgent(推荐)

使用Agent-agentmain方法影响的程序效果图

JDK1.6“新“特性Instrumentation之JavaAgent(推荐)

JavaAgent相关的API

在java.lang.instrument包下 给我们提供了相关的API

而最为主要的就是Instrumentation这个接口中的几个方法

JDK1.6“新“特性Instrumentation之JavaAgent(推荐)

后面我们会在代码中具体用到这些方法。再详细说明。

JavaAgent-premain方法1-初探效果:

实现main方法前执行业务逻辑

Agent1.java

Demo1.java

resources/META-INF/MANIFEST.MF

运行效果

Agent1 premain :input
demo1

JavaAgent-premain方法2-实现修改代码逻辑效果:

实现 修改 程序源代码 hello -> hello agented

Agent2.java

ConsoleTransformer.java

Demo2.java

resources/META-INF/MANIFEST.MF

运行效果

Agent2 premain 2param :input
满足条件
hello  agented
hello  agented
hello  agented
hello  agented

JavaAgent-premain方法3-无侵入动态修改程序源代码实现方法耗时统计效果:

实现main方法外的所有方法统计时间

Agent3.java

Demo3.java

resources/META-INF/MANIFEST.MF

运行效果

Agent3 premain :input
sleep1$Agent() cost:1005
sleep2$Agent() cost:2001

JavaAgent-agentmain方法1-实现运行时修改程序效果:

实现运行时 修改程序 hello -> hello agented

Agent4.java

Demo4

resources/META-INF/MANIFEST.MF

此时的运行顺序
打包agent4 -> 先运行demo2 -> 运行demo4 ->选择程序demo2结尾的程序,即可运行时修改文件

运行效果
Demo2

Agent4 premain 2param:input
hello
hello

Demo4

Demo2

JavaAgent-agentmain方法2-实现动态修改日志级别效果:

实现运行时 修改程序 模拟项目中的动态日志 info <-> debug

Agent5.java

注意,需要先把LogLevelStarter.java中的isDebug 改为true编译一下。放到src/main/resources/目录下;

LogLevelStarter.java

resources/META-INF/MANIFEST.MF

此时的运行顺序
打包agent5 -> 先运行LogLevelStarter -> 运行demo4 ->选择程序LogLevelStarter结尾的程序,即可运行时修改文件

运行效果

LogLevelStarter

Agent5 premain 2param :input
volatile debug atomicDebug info
volatile debug atomicDebug info

Demo4

LogLevelStarter

在Agent5中,其实使用premain和agentmain。

premain把volatile修饰的isDbug给修改为true了。

而agentmain时把atomicDebug的值进行多次取反操作。

自己实现一个热部署功能的大致思路

当运行完本项目中的几个demo之后。

读者可能对Java Agent有了一些基本的概念

最起码我们知道了premain是可以运行在main函数前的。

agentmain是可以在程序运行时,修改程序内的一些类文件的。

那么热部署很明显就是使用的agentmain这个特性了

那么热部署具体应该怎么实现呢?

这里先有个大概的思路。后续如果有经历,可以简单按照这个思路实现一下

思路

当我们文件发生修改的时候,项目会重新加载我们的类。

那么这里肯定会涉及到文件变化的观察。 即 观察者设计模式跑不了

首先递归当前项目目录。并根据文件类型,如(.java ,xml,yml等)将此类文件注册观察者模式。

当文件内容发生变化时,会调用 监听器中的回调方法;

在回调中完成如下(具体实现时未必需要)

使用Java1.6的JavaCompiler编译Java文件;
自定义ClassLoader 装载 编译好的Class到堆中

使用agentmain修改原Class文件替换成新的Class文件

完成热加载

JavaAgent的应用场景

apm:(Application Performance Management)应用性能管理。pinpoint、cat、skywalking等都基于Instrumentation实现
idea的HotSwap、Jrebel等热部署工具
应用级故障演练
Java诊断工具Arthas、Btrace等

源代码

总结

到此这篇关于JDK1.6“新“特性Instrumentation之JavaAgent的文章就介绍到这了,更多相关JDK1.6“新“特性Instrumentation内容请搜索我是攻城狮以前的文章或继续浏览下面的相关文章希望大家以后多多支持我是攻城狮!

本文来自网络,不代表我是攻城狮立场,转载请注明出处:https://www.54gcs.cn/programming/java/88965.html

helwo作者

上一篇
下一篇

为您推荐

发表评论

联系我们

联系我们

在线咨询: QQ交谈

邮箱: web@5vo.cn

工作时间:周一至周五,9:00-17:30,节假日休息
关注微信
微信扫一扫关注我们

微信扫一扫关注我们

手机访问
手机扫一扫打开网站

手机扫一扫打开网站

返回顶部
跳至工具栏