JavaAgent介绍 | 基本介绍及无侵入打印方法耗时

news2024/10/6 10:31:26

闲聊

最近在配置skywalking的过程中发现了-javaagent:这个配置,这里做一个简单的学习

什么是JavaAgent

网上似乎没有直接的文档介绍这个,只找了instrument包的相关文档,其内容页。其中的内容也都是介绍javaagent相关。

instrument包下核心就是字节码增强,此包下有2个核心接口ClassFileTransformerInstrumentation

  • ClassFileTransformer:An agent provides an implementation of this interface in order to transform class files.

  • ClassFileTransformer:代理需要实现这个接口,并对class文件转化(增强)

  • Instrumentation:This class provides services needed to instrument Java programming language code.

  • Instrumentation:Instrumentation 为代码增强提供了必要的服务和功能。

有什么用及怎么用

有什么用

代码增强可以用于监控代理、分析器、覆盖分析器和事件记录器。

怎么用

上面介绍了这么多编码过程,如果想要能使用,则需要打成jar包,具体使用需要通过-javaagent来让代码运行。总算知道为啥没有文档了,-javaagent主要是用来让代理生效的,核心是instrument包

如果伴随jar包启动,需要创建premain方法,并在MANIFEST.MF中指定Premain-Class: com.mountain.monk.MyAgent

如果是在启动后,再进行代理,则需要创建agentmain方法,并在MANIFEST.MF中指定Agent-Class: com.mountain.monk.MyAgent

实现一个计算函数执行时间的功能

  1. 随便创建一个类,创建premain方法,此处我使用了javassist来生成字节码

public class MyAgent {

    public static void premain(String agentArgs, Instrumentation inst) {
        inst.addTransformer(new TimeTransformer(),true);

    }



    public static class TimeTransformer implements ClassFileTransformer {


        @Override
        public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
            // 这里我们限制下,只针对目标包下进行耗时统计
            if (!className.startsWith("com/mountain/monk/")) {
                return classfileBuffer;
            }

            CtClass cl = null;
            try {
                ClassPool classPool = ClassPool.getDefault();

                cl = classPool.makeClass(new ByteArrayInputStream(classfileBuffer));


                for (CtMethod method : cl.getDeclaredMethods()) {
                    method.addLocalVariable("start", CtClass.longType);
                    method.insertBefore("start = System.currentTimeMillis(); ");
                    method.insertAfter("System.out.println(\"「monk」methodName:" + method.getName() + ", cost: \" + (System" +
                            ".currentTimeMillis() - start));");
                }

                return cl.toBytecode();
            } catch (Exception e) {
                System.err.println("Error transforming class: " + className);

                e.printStackTrace();
            }
            return classfileBuffer;

        }
    }
}
  1. 创建MANIFEST.MF,注意最后要空一行
Premain-Class: com.mountain.monk.MyAgent
Can-Redefine-Calsses: true
Can-Retransform-Classes: true

  1. 配置maven,注意:我这里需要把依赖打包进去
<build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>

    </build>
  1. 配置Idea启动参数

-javaagent:/Users/chenhui/learn/monk_note/self_agent/target/self_agent-1.0-SNAPSHOT-jar-with-dependencies.jar

  1. 随便找一个代码启动

  • 代码地址:https://github.com/Nortyr/monk_note/tree/main/self_agent
  • 参考链接:https://docs.oracle.com/javase/6/docs/api/java/lang/instrument/package-summary.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1456635.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【深蓝学院】移动机器人运动规划--第5章 最优轨迹生成--笔记

文章目录 1. Preliminaries2. Multicopter dynamics and differential flatness&#xff08;多旋翼动力学和微分平坦特性&#xff09;2.1 Differential Flatness2.2 具体建模2.3 Flatness Transformation的解析推导 3. Trajectory Optimization轨迹优化3.1 Problem formulation…

5年测试被裁,年前恶补3个月上岸字节28K,面试差点被问哭···

我的个人背景非常简单&#xff0c;也可以说丝毫没有亮点。 学历普通&#xff0c;计算机专业二本毕业&#xff0c;毕业后出来就一直在一家小公司&#xff0c;岁月如梭细&#xff0c;算了下至今从事软件测试已经5年了&#xff0c;也点点点了五年&#xff0c;每天都是重复的工作&…

【 JS 进阶 】原型对象、面向对象

目标 了解构造函数原型对象的语法特征&#xff0c;掌握 JavaScript 中面向对象编程的实现方式&#xff0c;基于面向对象编程思想实现 DOM 操作的封装。 了解面向对象编程的一般特征掌握基于构造函数原型对象的逻辑封装掌握基于原型对象实现的继承理解何为原型链及其作用能够处理…

安全测试工具安装指南:在统信UOS上部署Burp Suite

原文链接&#xff1a;安全测试工具安装指南&#xff1a;在统信UOS上部署Burp Suite 大家好&#xff01;在网络安全领域&#xff0c;Burp Suite是一款不可或缺的工具&#xff0c;它提供了从初级映射和分析应用程序攻击面到查找和利用安全漏洞的一系列功能。今天&#xff0c;我将…

Pytorch框架-----torch.tensor(创建张量)

文章目录 前言一、torch.Tensor二、构建tensor1.从Python的list或序列构建2.空张量3.索引和切片来获取和修改一个张量tensor中的内容 前言 torch.Tensor 是包的核心类。如果将其属性 .requires_grad 设置为 True&#xff0c;则会开始跟踪针对 tensor的所有操作。完成计算后&am…

VS引用第三方库

使用Qt开发习惯了&#xff0c;切换来VS环境&#xff0c;居然引用第三方库&#xff0c;都有所不适应&#xff1b;因为之前都是在Qt项目的pro文件里面直接手写配置好第三方库的include目录、lib目录和依赖的lib名称和拷贝dll语句. Vs也一样&#xff0c;如下三步&#xff1a; 第一…

世界顶级名校计算机专业,都在用哪些书当教材?(文末送书)

目录 01《深入理解计算机系统》02《算法导论》03《计算机程序的构造和解释》04《数据库系统概念》05《计算机组成与设计&#xff1a;硬件/软件接口》06《离散数学及其应用》07《组合数学》08《斯坦福算法博弈论二十讲》参与规则 清华、北大、MIT、CMU、斯坦福的学霸们在新学期里…

板块一 Servlet编程:第三节 HttpServletRequest对象全解与请求转发 来自【汤米尼克的JAVAEE全套教程专栏】

板块一 Servlet编程&#xff1a;第三节 HttpServletRequest对象全解与请求转发 一、什么是HttpServletRequest二、接收请求的常用方法三、请求乱码问题四、请求转发&#xff1a;forward五、Request作用域getParameter和getAttribute的区别 在上一节中我们已经学习了完整的Servl…

【Linux】进程地址空间的理解

进程地址空间的理解 一&#xff0c;什么是程序地址空间二&#xff0c;页表和虚拟地址空间三&#xff0c;为什么要有进程地址空间 一&#xff0c;什么是程序地址空间 在我们写程序时&#xff0c;都会有这样下面的内存结构&#xff0c;来存放变量和代码等数据。 一个进程要执行…

【安全狐】Windows隐藏计划任务技术及排查方法

0x00 前置知识 计划任务SCHTASKS命令 SCHTASKSSCHTASKS /Create 参数 SCHTASKS /Create [/S system [/U username [/P [password]]]][/RU username [/RP password]] /SC schedule [/MO modifier] [/D day][/M months] [/I idletime] /TN taskname /TR taskrun [/ST starttim…

掘根宝典之C++深复制与浅复制(复制构造函数,默认复制构造函数)

到目前为止我们已经学了构造函数&#xff0c;默认构造函数&#xff0c;析构函数&#xff1a;http://t.csdnimg.cn/EOQxx 转换函数&#xff0c;转换构造函数&#xff1a;http://t.csdnimg.cn/kiHo6 友元函数&#xff1a;http://t.csdnimg.cn/To8Tj 接下来我们来学习一个新函数…

FL Studio21.2.3最新版一键安装版专业版水果FLStudio 2024最新下载

FL Studio21.2.3.4004中文破解版系统要求&#xff1a; 版本&#xff1a;v21.2.3 内部版本 [4004] 开发商&#xff1a; Image-Line 格式&#xff1a;独立、VST 位深度&#xff1a;64位 界面语言&#xff1a;英语、德语、西班牙语、法语、中文。 系统环境 Microsoft Window…

AcuAutomate:一款基于Acunetix的大规模自动化渗透测试与漏洞扫描工具

关于AcuAutomate AcuAutomate是一款基于Acunetix的大规模自动化渗透测试与漏洞扫描工具&#xff0c;该工具旨在辅助研究人员执行大规模的渗透测试任务。 在大规模的安全测试活动中&#xff0c;AcuAutomate可以帮助我们同时启动或停止多个Acunetix扫描任务。除此之外&#xff…

ASUS华硕枪神8笔记本电脑G614JIR,G814JVR,G634JYR,G834JZR工厂模式出厂Windows11系统 带重置还原功能

适用ROG枪神8系列笔记本型号&#xff1a; G614JIR、G614JVR、G634JYR、G634JZR G814JIR、G814JVR、G834JYR、G834JZR 链接&#xff1a;https://pan.baidu.com/s/1tYZt6XFNC2d6YmwTbtFN7A?pwd3kp8 提取码&#xff1a;3kp8 带有ASUS RECOVERY恢复功能、自带所有驱动、出厂主…

minio+nginx 集群快速搭建

文章目录 1、概要2、整体架构流程3、集群搭建3.1、服务器准备3.2、下载并安装3.3、minio集群配置3.4、minio.service配置3.5、启动 4、nginx 转发 1、概要 minIO 是一个开源的分布式对象存储服务&#xff0c;可用于构建高可用性和高扩展性的存储集群。 分布式架构&#xff1a;…

Ubuntu本地安装code-server结合内网穿透实现安卓平板远程写代码

文章目录 1.ubuntu本地安装code-server2. 安装cpolar内网穿透3. 创建隧道映射本地端口4. 安卓平板测试访问5.固定域名公网地址6.结语 1.ubuntu本地安装code-server 准备一台虚拟机,Ubuntu或者centos都可以&#xff0c;这里以VMwhere ubuntu系统为例 下载code server服务,浏览器…

http协议概念与使用

一、http相关概念 1.1 什么是 http HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求&#xff0c;请求头包含请求的方法、URL、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。 服务器以一个状态行作为响应&#xff0c;响应的内容包括消息协…

STM32-点亮 LED

目录 1 、电路构成及原理图 2 、编写实现代码 3、代码讲解 4、烧录到开发板调试、验证代码 5、检验效果 本人使用的是朗峰 STM32F103 系列开发板&#xff0c;此笔记基于这款开发板记录。 1 、电路构成及原理图 首先&#xff0c;通过朗峰 F1 开发板 LED 部分原理图看到…

计算机专业必看《编程之神》

前言 这是一部关于数学家艾伦图灵&#xff08;Alan Turing&#xff09;的人物传记电影,非常值得一看. 影片中&#xff0c;艾伦图灵被描绘成一个富有创造力、勇气和独立思考的人物。他的天才思维和对计算机的理解在纠缠复杂的密码解密过程中发挥了重要作用。 图灵的天才 提出图灵…

20. 【Linux教程】emacs 编辑器

前面小节介绍了如何使用 vim 编辑器和 nano 编辑器&#xff0c;本小节介绍 emacs 编辑器&#xff0c;emacs 编辑器最开始是作为控制台的编辑器&#xff0c;并且 emacs 编辑器仍然提供最早的命令行模式。 1. 检查 Linux 系统中是否安装 emacs 编辑器 使用如何命令检查 emacs 编…