文章目录

  • 什么是javaagent
  • javaagent的jar包 和 普通jar包的区别
  • 从零搭建第一个javaagent
    • 【pom.xml】
    • 【Agent Code】
    • 【编译成jar】
    • 【引入agent jar 为当前应用启动前插入premain逻辑】
  • javaagent 流程示意图
  • 进阶Demo
  • Javassist 引入

什么是javaagent

简单来说, javaagent 是在class 被装在到ClassLoader之前对其拦截,插入自定义的监听字节码,可实现零侵入的监控,是APM的核心技术

Java1.5之后引入的特性

JavaAgent 运行在 main方法之前 ,内置的方法名为premain,即先执行premain方法,然后再执行main方法。通过premain方法,可实现一个JavaAgent。

javaagent 应用场景:监控、代码覆盖率分析 、JProfiler、应用破解等等等


javaagent的jar包 和 普通jar包的区别

javaagent 其实就是一个jar 包,通过-javaagent:xxx.jar 引入监控目标应用。那这个jar 和普通的jar 的区别在哪里呢?

我们来先看个结论


从零搭建第一个javaagent

maven搭建 编译

【pom.xml】

 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.artisan</groupId><artifactId>javaagent</artifactId><version>1.0-SNAPSHOT</version><build><plugins><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.artisan.ssist.JavaAgentDemo</Premain-Class><Boot-Class-Path>javassist-3.18.1-GA.jar</Boot-Class-Path><Can-Redefine-Classes>false</Can-Redefine-Classes></manifestEntries></archive><skip>true</skip></configuration></plugin></plugins></build><dependencies><dependency><groupId>org.javassist</groupId><artifactId>javassist</artifactId><version>3.18.1-GA</version></dependency></dependencies></project>
  • Premain-Class:指定包含 premain 方法的类名 ,改成自己的类
  • Can-Redefine-Class:是否能重新定义此代理所需的类,默认为 false。

【Agent Code】

package com.artisan.ssist;import java.lang.instrument.Instrumentation;public class JavaAgentDemo {public  static void premain(String args ,Instrumentation instrumentation){System.out.println("premain  first agent demo");}
}

【编译成jar】

点击 M, 执行 mvn clean package

查看jar包中的 MANIFEST.MF文件 , MANIFEST.MF文件用于描述Jar包的信息,例如指定入口函数等。


【引入agent jar 为当前应用启动前插入premain逻辑】

jvm参数指定

-javaagent:E:\IdeaProjects\javaagent\target\javaagent-1.0-SNAPSHOT.jar

执行,观察我们引入的这个jar包中的premain方法是否优先于这个测试类的main方法执行

OK ,这个就是Java Agent的 简单小栗子, 更强大的功能继续开篇


javaagent 流程示意图


进阶Demo

public class AgentMain {public static void premain(String args, Instrumentation instrumentation)throws Exception, ClassNotFoundException {// 实例化对象UserService userService = new UserService();// 类比ClassLoaderClassPool classPool = new ClassPool();// 追加系统ClassLoaderclassPool.appendSystemPath();// 获取一个类CtClass ctClass = classPool.get("com.artisan.agent.UserService");// 获取方法CtMethod sayHello = ctClass.getDeclaredMethod("sayHello");// 在方法执行之后插入下面这行语句sayHello.insertAfter("System.out.println(\"I am fine\");");// 重新定义一个类instrumentation.redefineClasses(new ClassDefinition(UserService.class,ctClass.toBytecode()));// 调用服务   这里的userservice 已经是被重新定义的 对象了userService.sayHello();}

总结

  • 1.instrumentation addTransformer 类装载拦截
  • 2.只能拦截未装载过的类
  • 3.instrumentation#retransformClasses方法 重新装载类 ,必须开启相关参数
  • 4.instrumentation.redefineClasses 重新定义一个类 ,不能添加新方法 ,必须开启相关参数

开启参数

agent 依懒包逗号分割
Boot-Class-Path: javassist-3.18.1-GA.jar
是否允许重定义
Can-Redefine-Classes: true
允许重载
Can-Retransform-Classes:true

Javassist 引入

既然是搞字节码,有没有类库 ?

其实上面的栗子 其实已经使用了Javassist 类库了~

Javassist是一个开源的分析、编辑和创建Java字节码的类库。

关于java字节码的处理, 目前有很多开源工具可用,比如asm,bcel, 不过这些都需要直接跟虚拟机指令打交道,实在是太难。。。。。

如果不想了解虚拟机指令,可以采用javassist。

javassist是jboss的一个子项目,优点简单 快速 ,直接使用java编码的形式,而不需要了解虚拟机指令,就能动态改变类的结构,或者动态生成类。

APM - Hello Javaagent相关推荐

  1. APM - 使用JavaAgent+Javassit 插桩C3P0

    文章目录 核心思想 编码实现 打包 配置验证 核心思想 <bean id="dataSource" class="com.mchange.v2.c3p0.Combo ...

  2. java agent_GitHub - dingjs/javaagent: 基于javaagent开发的APM工具,收集方法的执行次数和执行时间,定时输出成json格式的日志。...

    Javaagent 概述 javaagent是一个简单优雅的java agent,利用java自带的instrument特性+javassist字节码编辑技术,实现了无侵入的方法级性能监控.相比于Ne ...

  3. 开源APM监控Pinpoint的快速部署和使用

    版权声明:本文为博主原创文章,未经博主允许不得转载.欢迎访问我的博客 https://blog.csdn.net/smooth00 Pinpoint是用于大规模分布式系统的APM工具.它是在Dappe ...

  4. 开源APM技术选型与实战

    http://www.infoq.com/cn/articles/apm-Pinpoint-practice?utm_source=infoq&utm_medium=popular_widge ...

  5. 回到网易后开源APM技术选型与实战

    篇幅一:APM基础篇 \\ 1.什么是APM? \\ APM,全称:Application Performance Management ,目前市面的系统基本都是参考Google的Dapper(大规模 ...

  6. 万字长文剖析 APM 系统?如何设计与实现?

    -     前言    - 本文来说说什么是 APM 系统,也就是大家平时说的监控系统,以及怎么实现一个 APM 系统.因为一些特殊的原因,我在文中会使用 Dog 作为我们的系统名称进行介绍. 我们为 ...

  7. pinpoint性能检测工具搭建(APM)

    由于最近测试需要,搭建了一套apm监控平台,官网目前更新的是jar格式,本次是以旧版本1.8搭建 需要的软件: Hbase1.3 JDK1.8 Linux服务器(我这里是以CentOS7为例) apa ...

  8. [APM] 解读APM技术分类和实现方式

    在讲了APM的历史.作用和实际案例之后,下面我们来了解一下APM技术分类和实现方式以及它未来的发展趋势.在这之前,我们首先需要了解一下典型的互联网或移动互联网应用的整个应用交付链. 图1 上面这张示意 ...

  9. 知名的开源apm(Application Performance Management)工具

    现代APM体系,基本都是参考Google的Dapper(大规模分布式系统的跟踪系统)的体系来做的. 通过跟踪请求的处理过程,来对应用系统在前后端处理.服务端调用的性能消耗进行跟踪,关于Dapper的介 ...

最新文章

  1. Swift 函数和类
  2. Adobe Flash Player(Flash播放器)下载地址
  3. 使用CAtlRegExp正则表达式检查浮点数输入
  4. mysqlpump 备份文件压缩对比
  5. 基本程序 打印Scala的Hello World
  6. 深入Atlas系列:Web Sevices Access in Atlas示例(3) - 在Web Services方法中使用多态
  7. Try using .loc[row_indexer,col_indexer] = value instead
  8. 使用计算机粘贴板的步骤,电脑中快速打开剪贴板查看器的方法
  9. 方差分析表和回归分析表的那些浆糊糊
  10. windows win10笔记本如何修改屏幕显示亮度、对比度、色调、饱和度?(英特尔显卡控制中心)
  11. mysql 节假日判断_sql 节假日判断(春节、中秋、国庆、周末等)
  12. 【XSY3952】简单的计数题(dp)
  13. 如何判断Android系统的版本
  14. grpc AS编译报No such property: javaCompilerTask for class错误
  15. volatile,CAS,ABA三个关键字
  16. Android OTA版本任意升级
  17. 防关联浏览器哪个好(防关联核心7要素)
  18. 如何在cmd查看文件内容的MD5值
  19. 电商项目测试实战(七)化妆品页面用例设计
  20. 现在月薪6000,想辞职创业卖早餐,你觉得可行吗?

热门文章

  1. Android:安卓APP开发显示一个美女,安卓APP开发显示两个美女
  2. 机器学习——线性回归数学推导
  3. css 水珠动图,CSS3逼真水珠特效
  4. 数字字符串转化为字母组合的种数
  5. 【转载】Few-shot learning(少样本学习)和 Meta-learning(元学习)概述
  6. Pytorch离线安装的纯净版
  7. 文巾解题 1190. 反转每对括号间的子串
  8. R语言入门系列-软件下载,环境搭建,数据导入导出
  9. 你的画像是怎么来的?推荐系统是如何找到相似用户的?
  10. R语言应用实战系列(三)-智能推荐模型的构建