1 java agent原理

上文中我们知道,要使用Skywalking去监控服务,需要在其 VM 参数中添加 “-javaagent:/usr/local/skywalking/apache-skywalking-apm-bin/agent/skywalking-agent.jar"。这里就使用到了java agent技术。

1.1 Java agent 是什么?

Java agent是java命令的一个参数。参数 javaagent 可以用于指定一个 jar 包。

1. 这个 jar 包的 MANIFEST.MF 文件必须指定 Premain-Class 项。

2. Premain-Class 指定的那个类必须实现 premain() 方法。

当Java 虚拟机启动时,在执行 main 函数之前,JVM 会先运行 -javaagent 所指定 jar 包内 Premain-Class 这个类的 premain 方法 。

1.2 如何使用java agent?

使用 java agent 需要几个步骤:

1. 定义一个 MANIFEST.MF 文件,必须包含 Premain-Class 选项,通常也会加入Can-Redefine-Classes 和 Can-Retransform-Classes 选项。

2. 创建一个Premain-Class 指定的类,类中包含 premain 方法,方法逻辑由用户自己确定。

3. 将 premain 的类和 MANIFEST.MF 文件打成 jar 包。

4. 使用参数 -javaagent: jar包路径 启动要代理的方法。

2 搭建java agent工程

使用maven创建java_agent_demo工程:

在java文件夹下新建PreMainAgent类:

import net.bytebuddy.agent.builder.AgentBuilder;
import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.dynamic.DynamicType;
import net.bytebuddy.implementation.MethodDelegation;
import net.bytebuddy.matcher.ElementMatchers;
import net.bytebuddy.utility.JavaModule;import java.lang.instrument.Instrumentation;public class PreMainAgent {/*** 在这个 premain 函数中,开发者可以进行对类的各种操作。* 1、agentArgs 是 premain 函数得到的程序参数,随同 “– javaagent”一起传入。与 main 函数不同的是,* 这个参数是一个字符串而不是一个字符串数组,如果程序参数有多个,程序将自行解析这个字符串。* 2、Inst 是一个 java.lang.instrument.Instrumentation 的实例,由 JVM 自动传入。** java.lang.instrument.Instrumentation 是 instrument 包中定义的一个接口,也是这个包的核心部分,* 集中了其中几乎所有的功能方法,例如类定义的转换和操作等等。* @param agentArgs* @param inst*/public static void premain(String agentArgs, Instrumentation inst) {System.out.println("=========premain方法执行1========");System.out.println(agentArgs);}/*** 如果不存在 premain(String agentArgs, Instrumentation inst)* 则会执行 premain(String agentArgs)* @param agentArgs*/public static void premain(String agentArgs) {System.out.println("=========premain方法执行2========");System.out.println(agentArgs);}}

注意:

        1、类中提供两个静态方法,方法名均为premain,不能拼错。

        2、如果不存在 premain(String agentArgs, Instrumentation inst),则会执行 premain(String agentArgs)

在pom文件中添加打包插件:

<build><plugins><plugin><artifactId>maven-assembly-plugin</artifactId><configuration><appendAssemblyId>false</appendAssemblyId><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs><archive><!--自动添加META-INF/MANIFEST.MF --><manifest><addClasspath>true</addClasspath></manifest><manifestEntries><Premain-Class>PreMainAgent</Premain-Class><Agent-Class>PreMainAgent</Agent-Class><Can-Redefine-Classes>true</Can-Redefine-Classes><Can-Retransform-Classes>true</Can-Retransform-Classes></manifestEntries></archive></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin></plugins></build>

该插件会在自动生成META-INF/MANIFEST.MF文件时,帮我们添加agent相关的配置信息。

使用maven的package命令进行打包:

打包成功之后,复制打包出来的jar包地址。

3 搭建主工程

使用maven创建java_agent_user工程:

Main类代码:

package com.agent;public class Main {public static void main(String[] args) {System.out.println("Hello World");}
}

先运行一次,然后点击编辑MAIN启动类:

在VM options中添加代码:

代码为:

-javaagent:路径\java-agent-demo-1.0-SNAPSHOT.jar=test

启动时加载javaagent,指向上一节中编译出来的java agent工程jar包地址,同时在最后追加参数

HELLOAGENT。

运行MAIN方法,查看结果:

可以看到java agent的代码优先于MAIN函数的方法运行,证明java agent运行正常。

Skywalking(11): java agent原理相关推荐

  1. Skywalking插件开发Java agent

    Java agent 1.Java agent是什么 Java agent是java命令的一个参数.参数javaagent可以用于指定一个jar包. 这个jar包的MAINFEST.MF文件必须指定P ...

  2. 入侵JVM?Java Agent原理浅析和实践(上)

    声明:本文首发于京东零售技术公众号,为博主本人撰写投稿. 前言: 在平时的开发中,我们不可避免的会使用到Debug工具,JVM作为一个单独的进程,我们使用的Debug工具可以获取JVM运行时的相关的信 ...

  3. java agent技术原理及简单实现

    注:本文定义-在函数执行前后增加对应的逻辑的操作统称为MOCK 1.引子 在某天与QA同学进行沟通时,发现QA同学有针对某个方法调用时,有让该方法停止一段时间的需求,我对这部分的功能实现非常好奇,因此 ...

  4. 说实话,你工作5年,不知道什么是Java agent技术,让我很吃惊...

    注:本文定义-在函数执行前后增加对应的逻辑的操作统称为MOCK. 引子 在某天与QA同学进行沟通时,发现QA同学有针对某个方法调用时,有让该方法停止一段时间的需求,我对这部分的功能实现非常好奇,因此决 ...

  5. java 字节码增强原理_深入浅出Java探针技术1--基于java agent的字节码增强案例

    Java agent又叫做Java 探针,本文将从以下四个问题出发来深入浅出了解下Java agent 一.什么是java agent? Java agent是在JDK1.5引入的,是一种可以动态修改 ...

  6. Apache SkyWalking Java Agent 05-插件加载机制(下)

    基于 SkyWalking Java Agent 8.8.0 版本 上一篇文章中我们重点分析了自定义类加载器 AgentClassLoader.initDefaultLoader() 部分,Agent ...

  7. 【Java综合专栏】「引领序幕」全链路追踪原理之Java Agent探针的技术介绍(上篇)

    前提概要 Java调式.热部署.JVM背后的支持者Java Agent: 各个 Java IDE 的调试功能,例如 eclipse.IntelliJ : 热部署功能,例如 JRebel.XRebel. ...

  8. SkyWalking之安装Java agent

    参考官方文档: document-cn-translation-of-skywalking/README.md at master · SkyAPM/document-cn-translation-o ...

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

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

最新文章

  1. 【spring boot】url中传递session id
  2. python画图数据的平均值怎么算的_Python气象数据处理与绘图(2):常用数据计算方法...
  3. Spark SQL(二)之DataSet操作
  4. 前端学习(16):跳转链接小练习
  5. php开发工程师考试试卷,腾讯PHP开发工程师面试试卷
  6. 如何解决系统补丁(KB971092)重复安装问题
  7. C# 参考之方法参数关键字:params、ref及out (收集)
  8. ufs qfil注意事项
  9. java爬取国家统计局之统计用区划和城乡划分代码(省市区三级)
  10. C语言实现一个矩阵乘法计算器
  11. oracle性质是渐进正态性,基于惩罚函数的回归量变选择方法.doc
  12. NVIDIA Forceware 260.89 Final 提升了多款游戏的性能
  13. 如何批量实现通过MP3标题重命名文件名
  14. fastboot 操作
  15. Jmeter性能测试-插件
  16. MYSQL求百分比的几种方法
  17. IDEA快捷键 进行查找和批量替换
  18. 游戏开发者放心!Cocos引擎未感染XcodeGhost
  19. java基于微信小程序的大学生个人家庭理财产品 uniapp小程序
  20. 在实验室服务器平台怎么用上jupyter notebook?并进入虚拟环境

热门文章

  1. 贵阳大数据战略发力 与滴滴共建网约车大数据中心
  2. 虚拟机建立的服务器让主机登陆,添加ESXi主机并建立虚拟机
  3. 神途boss_神途boss刷新点一举一动都显出了足够的萌属性
  4. oce专项认证 oracle_Oracle认证:经常问到的问题(OCA, OCP, OCE, OCM)
  5. UG/NX二次开发Siemens官方NXOPEN实例解析—1.3 BlockStyler/ExtrudewithPreview
  6. Python 给视频添加背景音乐 | Python工具
  7. 仿制慕课网app实现斗鱼,全民k歌视频引导页(ViewVideoViewPaper)炫酷效果
  8. 为什么现在的手机要取消呼吸灯?
  9. 【算法学习笔记十】NP问题
  10. 无线传感器网络标准化进展与协议分析