java agent技术

 从JDK1.5之后引入了java angent技术

Java Agent 是一种强大的技术,它允许开发者在 JVM 启动时运行期间动态地修改类的字节码,从而实现诸如性能监控、日志记录、AOP(面向切面编程)等功能

java agent依赖于Instrumentation API,是 Java 提供的一个用于操作已加载类的字节码的标准API。通过这个API,你可以修改类的字节码,甚至可以在不重启应用的情况下重新定义已经加载的类

具体的实现过程是通过一个agent来对字节码进行修改,agent实际上是一个特殊的jar包,包含了一个或多个特定的方法(premainagentmain),这些方法会在JVM启动时或者运行期间被调用

premain:

顾名思义是在应用程序的main函数执行之前执行的

1.在 premain 方法执行时,JVM 已经加载了一些基础类,但你的应用程序的主要类(以及其它未加载的类)通常还没有被加载。

2.通过 premain 方法中注册的 ClassFileTransformer 可以拦截并修改之后加载的所有类的字节码

3.如果你希望通过 Java Agent 修改某个类的行为,确保该类在 premain 方法中已经注册了相应的转换器是很重要的。对于已经加载的类,你需要使用 retransformClasses 或其他方法来重新处理它们。

对于这种方式实现的agent需要在启动应用程序的时候通过参数指定执行这个agenr的jar包

agentmain:

需要通过attach API通过 Attach API 动态加载 Agent,允许你对已经加载的类进行重新转换(retransform)

对于这种方式实现的agent可以在运行时通过Attach API 动态执行

主要注意的时动态执行agent的时候,如果原应用程序中的方法已经在执行的话,正在执行的方法会按照旧的字节码信息继续执行,但是agent执行之后的方法执行的是根据agent修改之后新的字节码信息

新旧共存的原理:

类加载之后方法的字节码是存在方法区中的,agent修改字节码之后原来旧的字节码将会被覆盖,那么新旧是怎么共存的呢?

实际上jvm中,每加载一个类就会对应生成一个klass对象来表示这个类的元数据结构

方法区中会存储已被虚拟机加载的类信息、常量、静态变量等。也就是方法区中的类信息指向这个klass对象

当字节码被修改之后,方法区中类信息会更新为最新的klass对象,即方法区中存储的都是最新的类信息

在方法调用执行的时候,会创建一个栈帧,栈帧并不直接指向方法区中的字节码,而是依赖于类的 Klass 对象提供的元数据来执行字节码

所以即使修改了类的字节码,只是新建了一个klass对象,并且方法区中指向了这个新的klass对象,但是栈帧并不知道方法区中的变化,因为栈帧只是在创建的时候绑定了一个klass对象,并且根据这个klass对象来执行上下文

那两种agent方法可以共存吗?

是可以共存的,但是不会在同一 JVM 实例中同时执行。

通过参数启动的话只会执行premain方法内的逻辑,通过attach API的话只会执行agentmain方法中的逻辑

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

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

相关文章

LLaMA Factory 深度调参

注意,本文涵盖从基础调参到前沿研究的完整知识体系,建议结合具体业务场景灵活应用。一篇“参考文献”而非“可运行的代码”。https://github.com/zysNLP/quickllm 初始指令: llamafactory-cli train \--stage sft \--do_train True \--mode…

Linux驱动:驱动编译流程了解

要求 1、开发板中的linux的zImage必须是自己编译的 2、内核源码树,其实就是一个经过了配置编译之后的内核源码。 3、nfs挂载的rootfs,主机ubuntu中必须搭建一个nfs服务器。 内核源码树 解压 tar -jxvf x210kernel.tar.bz2 编译 make x210ii_qt_defconfigmakeCan’t use ‘…

Redis集群模式、持久化、过期策略、淘汰策略、缓存穿透雪崩击穿问题

Redis四种模式 单节点模式 架构​​:单个Redis实例运行在单台服务器。 ​​优点​​: ​​简单​​:部署和配置容易,适合开发和测试。 ​​低延迟​​:无网络通信开销。 ​​缺点​​: ​​单点故障​​&…

1.2 函数

函数的本质是描述变量间的依赖关系:​​一个变量(自变量)的变化会唯一确定另一个变量(因变量)的值​​。 ​​基本构成​​:通过符号(如YF(X))表达规则,X输入 → F处理 …

2025数字孪生技术全景洞察:从工业革命到智慧城市的跨越式发展

引言 数字孪生技术,这一融合物理世界与虚拟镜像的革新性工具,正以惊人的速度重塑产业格局。2025年,中国数字孪生市场规模预计达214亿元,工业制造领域占比超40%,其技术深度与行业落地成果令人瞩目。本文将结合最新数据与…

RabbitMQ 工作模式

RabbitMQ 一共有 7 中工作模式,可以先去官网上了解一下(一下截图均来自官网):RabbitMQ 官网 Simple P:生产者,要发送消息的程序;C:消费者,消息的接受者;hell…

VBA会被Python代替吗

VBA不会完全被Python取代、但Python在自动化、数据分析与跨平台开发等方面的优势使其越来越受欢迎、两者将长期并存且各具优势。 Python以其易于学习的语法、强大的开源生态系统和跨平台支持,逐渐成为自动化和数据分析领域的主流工具。然而,VBA依旧在Exc…

【开源工具】深度解析:基于PyQt6的Windows时间校时同步工具开发全攻略

🕒 【开源工具】深度解析:基于PyQt6的Windows时间校时同步工具开发全攻略 🌈 个人主页:创客白泽 - CSDN博客 🔥 系列专栏:🐍《Python开源项目实战》 💡 热爱不止于代码,热…

大模型项目:普通蓝牙音响接入DeepSeek,解锁语音交互新玩法

本文附带视频讲解 【代码宇宙019】技术方案:蓝牙音响接入DeepSeek,解锁语音交互新玩法_哔哩哔哩_bilibili 目录 效果演示 核心逻辑 技术实现 大模型对话(技术: LangChain4j 接入 DeepSeek) 语音识别(…

qt命名空间演示

#ifndef CIR_H #define CIR_Hnamespace cir {double PI3.141592653;//获取圆行周长double getLenthOfCircle(double radius){return 2*PI*radius;}//获取圆形面积double getAreaOfCircle(double radius){return PI*radius*radius;}} #endif // CIR_H#include <iostream> …

使用 Java 反射动态加载和操作类

Java 的反射机制(Reflection)是 Java 语言的一大特色,它允许程序在运行时检查、加载和操作类、方法、字段等元信息。通过 java.lang.Class 和 java.lang.reflect 包,开发者可以动态加载类、创建实例、调用方法,甚至在运行时构造新类。反射是 Java 灵活性的核心,广泛应用于…

《 C++ 点滴漫谈: 三十七 》左值?右值?完美转发?C++ 引用的真相超乎你想象!

摘要 本文全面系统地讲解了 C 中的引用机制&#xff0c;涵盖左值引用、右值引用、引用折叠、完美转发等核心概念&#xff0c;并深入探讨其底层实现原理及工程实践应用。通过详细的示例与对比&#xff0c;读者不仅能掌握引用的语法规则和使用技巧&#xff0c;还能理解引用在性能…

【AutoGen深度解析】下一代AI代理编程框架实战指南

目录 &#x1f31f; 前言&#x1f3d7;️ 技术背景与价值&#x1f6a7; 当前技术痛点&#x1f6e0;️ 解决方案概述&#x1f465; 目标读者说明 &#x1f50d; 一、技术原理剖析&#x1f5bc;️ 核心概念图解&#x1f4a1; 核心作用讲解⚙️ 关键技术模块说明&#x1f504; 技术…

Python-AI调用大模型 给出大模型人格案例

Python调用通义千问模拟原神雷电将军口吻 最近在用AI编辑器写AI对话 尝试给AI对话增加人格 以下是使用阿里通义千问大模型模拟《原神》中雷电将军(雷电影)口吻的代码案例&#xff0c;包含典型的高傲威严、略带古风的说话风格。 完整后端代码示例 import dashscope from dash…

csdn博客打赏功能

CSDN_专业开发者社区_已接入DeepSeekR1满血版 官网: 最右下角 耳机 就是客服 可以转人工 开启打赏功能如下: 1.因为博主本人不可以对本人账号文章进行打赏&#xff0c;因此本人账号打开文章详情页不显示打赏按钮。为了验证账号设置的打赏功能是否生效所以让您使用无痕模式模…

【深度学习】目标检测算法大全

目录 一、R-CNN 1、R-CNN概述 2、R-CNN 模型总体流程 3、核心模块详解 &#xff08;1&#xff09;候选框生成&#xff08;Selective Search&#xff09; &#xff08;2&#xff09;深度特征提取与微调 2.1 特征提取 2.2 网络微调&#xff08;Fine-tuning&#xff09; …

26考研——中央处理器_指令流水线_指令流水线的基本概念 流水线的基本实现(5)

408答疑 文章目录 六、指令流水线指令流水线的基本概念流水线的基本实现流水线设计的原则流水线的逻辑结构流水线的时空图表示 八、参考资料鲍鱼科技课件26王道考研书 六、指令流水线 前面介绍的指令都是在单周期处理机中采用串行方法执行的&#xff0c;同一时刻 CPU 中只有一…

配置集群(yarn)

在配置 YARN 集群前&#xff0c;要先完成以下准备工作&#xff1a; 集群环境规划&#xff1a;明确各节点的角色&#xff0c;如 ResourceManager、NodeManager 等。网络环境搭建&#xff1a;保证各个节点之间能够通过网络互通。时间同步设置&#xff1a;安装 NTP 服务&#xff0…

vue实现与后台springboot传递数据【传值/取值 Axios 】

vue实现与后台springboot传递数据【传值/取值】 提示&#xff1a;帮帮志会陆续更新非常多的IT技术知识&#xff0c;希望分享的内容对您有用。本章分享的是node.js和vue的使用。前后每一小节的内容是存在的有&#xff1a;学习and理解的关联性。【帮帮志系列文章】&#xff1a;每…

二叉树路径总和

一、给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在根节点到叶子节点的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 112. 路径总和 - 力扣&…