Java Agent(上)
1、java agent是什么?
---》对用户透明,不侵入用户业务代码。让java虚拟机加载agent jar
2、java agent有什么用?
--->应用场景例如:调用链追踪项目,在用户无感知的情况下,记录日志。目前业内使用该技术的有,SkyWalking,Pinpoint(这个监控的粒度更小)
-各个 Java IDE 的调试功能,例如 eclipse、IntelliJ ;
-热部署功能,例如 JRebel、XRebel、 spring-loaded;
-各种线上诊断工具,例如 Btrace、Greys,还有阿里的 Arthas;
-各种性能分析工具,例如 Visual VM、JConsole 等
3、java agent的实现原理?
4、 入门案例
4.1、 如何制造自己第一个java agent jar包
4.1.1、 第一步:我们需要一个插件来帮助我们生成带特定格式的MAINIFEST.MF的jar
4.1.2、 第二步:在启动项目的时候,在jvm参数中添加 -javaagent: *\ving-agent-0.0.1-SNAPSHOT.jar (在jvm上先加载agent包)
(偷偷地问)特定格式的MAINIFEST.MF是怎样的?需要包括下面的内容
Manifest-Version: 1.0 Can-Redefine-Classes: true Can-Retransform-Classes: true Premain-Class: cn.think.in.java.clazz.loader.asm.agent.PreMainTraceAgent
(再偷偷地问),难度每次都让我手动去弄这个文件,我觉得很麻烦呀,有没一个工具能帮我们将agent项目打包成包含MAINIFEST.MF的jar?
-----》对,你猜对了,真的有这个工具。那就是maven插件。(说到打包,肯定要想到maven或者gradle了吧)
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.2</version> <configuration> <archive> <manifestEntries> <Project-name>${project.name}</Project-name> <Project-version>${project.version}</Project-version> <Premain-Class>com.tuling.agent.Agent</Premain-Class> <Can-Redefine-Classes>true</Can-Redefine-Classes> <Can-Retransform-Classes>true</Can-Retransform-Classes> <Boot-Class-Path>javassist-3.18.1-GA.jar</Boot-Class-Path> </manifestEntries> </archive> <skip>true</skip> </configuration> </plugin>
插件
打包之后
测试
问题二:如果有一个类已经被虚拟机加载了,那么我们的agent包里面的逻辑就不能加载这个类。但是我就是想把这类替换掉,怎么办呢?(热更新,虚拟机不停的情况下,替换成用户最新的代码)
插件
agent代码的修改
重新打包
测试
问题三:
当JVM已装置某个类,但是我们想重新走一次premain方法,我们怎样做呢?
插件
修改agent代码
打包
测试
思考
看到这里,细心的朋友,可能会带有疑问,我在实践的时候,发现这个类的字节码的生成并不简单,如果让我自己去手动去生成那就很麻烦呀?(麻烦--》复杂度高---》容易出错----》上线容易出问题---》那就直接不考虑该技术)
----》为了解决这个问题,java-ssist就出现了。关于java-ssist,请点击。
- 深入 Java 调试体系,第 2 部分: JVMTI 和 Agent 实现
- java 通过request.getHeader("user-agent")解析浏览器
- ODI 创建Java EE Agent
- 写那么多年Java,还不知道啥是Java agent的必须看一下!
- veridata使用报错:Failed: Agent remote message (101): Unhandled exception 'java.lang.ArrayIndexOutOfBound
- java.lang.NoClassDefFoundError: com.networkbench.agent.impl.instrumentation.NBSGsonInstrumentation
- Btrace 系列二 Java Agent and instrument
- ODI 创建Java EE Agent
- 根据 User Agent String 判断客户端平台及浏览器的 Java 程序
- 得用java agent instrument动态修改或替换相关
- 友盟报错 java.lang.NoClassDefFoundError: com.umeng.analytics.MobclickAgent
- 使用JDK的javaagent机制时候,遇到的蛋疼无比的ClassNotFoundException
- java.lang.NoClassDefFoundError: com.umeng.analytics.MobclickAgent 解决方法
- lotus java agent 编译选项java 版本设置
- Jenkins的配置从节点中默认没有Launch agent via Java Web Start,该如何配置使用
- java 解析http user-agent 信息
- Picked up JAVA_TOOL_OPTIONS: -javaagent:/usr/share/java/jayatanaag.jar的解决办法
- JVM源码分析之javaagent原理完全解读
- 如何在Apusic中正确加入“-javaagent”参数
- JVM源码分析之javaagent原理完全解读