说一下java的探针agent的应用场景
什么是agent
Java探针通常是指Java Agent
它是一种可以在JVM启动时或运行时加载的组件,用来修改或增强字节码,从而监控或改变程序的行为
agent应用在哪些方面
1.Arthas就是应用了我们的探针技术
2.代码热替换实现我们的热部署,Java Agent可以在类加载时修改字节码,从而实现热部署
3.数据脱敏,比如在应用层面对敏感数据进行加密或脱敏处理,可能通过修改相关方法的字节码,在数据返回前进行处理,比如在DAO层拦截结果集,对身份证号、手机号进行脱敏。
4.调用链跟踪,分布式系统中的链路追踪,比如SkyWalking框架,比如OpenTracing的实现,可能需要通过探针在服务调用的入口和出口添加跟踪代码,生成和传递TraceID,SpanID等信息,这样可以在分布式系统中追踪请求的路径
有些增强不需要agent,比如AOP的增强
某些框架可能使用Java Agent来实现切面编程,而不需要依赖Spring AOP之类的框架。
比如在类加载时直接织入切面逻辑
说一下agent的底层原理
核心机制:Instrumentation API
Java Agent(探针)的底层原理主要基于 JVM 的 Instrumentation API 和 字节码操作技术
通过 类加载机制 实现对 Java 应用的动态监控和修改
Java Agent 的底层能力由 java.lang.instrument 包提供,核心接口为 Instrumentation
void addTransformer(ClassFileTransformer transformer); // 注册字节码转换器
byte[] retransformClasses(Class<?>... classes); // 重新转换已加载的类
作用:允许 Agent 在 类加载时 或 运行时 修改类的字节码
启动时挂载和运行时挂载
a. 启动时挂载(Premain)
原理:通过 JVM 启动参数 -javaagent:agent.jar 指定 Agent。
流程:
- JVM 启动时加载
agent.jar,调用premain(String args, Instrumentation inst)方法。 - Agent 注册
ClassFileTransformer到Instrumentation实例。 - JVM 加载目标类时,触发
ClassFileTransformer修改字节码
b. 运行时挂载(Attach)
原理:通过 VirtualMachine.attach(pid) 动态注入 Agent 到已运行的 JVM 进程。
流程:
- 使用
com.sun.tools.attach.VirtualMachine连接到目标 JVM。 - 调用
loadAgent(agentJarPath)加载 Agent,触发agentmain(String args, Instrumentation inst)方法。 - 通过
retransformClasses()重新转换已加载的类
字节码操作技术
Agent 通过修改类的字节码实现功能增强,常用字节码操作库
类加载拦截流程
JVM 加载类的流程被 Agent 拦截并增强:
- 加载阶段:JVM 读取
.class文件的字节码。 - 转换阶段:调用注册的
ClassFileTransformer.transform()方法,修改字节码。 - 定义阶段:JVM 使用修改后的字节码定义类
public class MyTransformer implements ClassFileTransformer {@Overridepublic byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) {// 修改 classfileBuffer 并返回新字节码return enhancedBytecode;}
}
总结:Java agent 的核心流程
- 注册转换器:通过
Instrumentation注册ClassFileTransformer。 - 拦截类加载:JVM 加载类时调用转换器修改字节码。
- 动态增强:在目标方法中插入监控、日志、链路追踪等逻辑。
- 运行时生效:修改后的类被 JVM 直接使用,无需重启应用
agent加载的流程示意图
Premain 模式:
JVM启动 → 加载Agent → 注册Transformer → 拦截类加载 → 修改字节码 → 应用运行Agentmain 模式:
外部进程Attach → 加载Agent → 注册Transformer → 触发Retransform → 修改已加载类 → 立即生效
面试回答思路引导
Java Agent是JVM启动时或运行时加载的组件,用来修改或增强字节码,从而监控或改变程序的行为
一般在启动或者运行的时候,通过JavaAgent也就是我们探针技术,来修改字节码,来实现增强的业务逻辑
Java Agent 的核心价值在于 无侵入式增强,是 APM、动态调试等工具的关键技术基础,是一种动态技术
常见的agent技术会用在热部署和skywalking链路追踪这些地方
例如热部署我们就是可以在类加载之后替换字节码
例如skywalking链路追踪就是在启动的时候修改字节码,通过探针在服务调用的入口和出口添加跟踪代码,生成和传递TraceID,SpanID等信息,这样可以在分布式系统中追踪请求的路径
一般挂载方式分为两种agent挂载,一种是启动时挂载一种是运行时挂载
启动时挂载是在启动的时候加载需要的jar包到jvm里面并且修改的字节码
运行时挂载是通过动态注入到运行的jvm并加载agent,重新替换已经加载过的类
简单来说,就是在加载类的时候修改我们的字节码进行业务增强,然后让被修改后的类能被JVM直接使用
相关文章:
说一下java的探针agent的应用场景
什么是agent Java探针通常是指Java Agent 它是一种可以在JVM启动时或运行时加载的组件,用来修改或增强字节码,从而监控或改变程序的行为 agent应用在哪些方面 1.Arthas就是应用了我们的探针技术 2.代码热替换实现我们的热部署,Java Agent可…...
【嵌入式学习3】UDP发送端、接收端
目录 1、发送端 2、接收端 3、UDP广播 1、发送端 from socket import *udp_socket socket(AF_INET,SOCK_DGRAM) udp_socket.bind(("127.0.0.1",3333))data_str "UDP发送端数据" data_bytes data_str.encode("utf-8") udp_socket.sendto(d…...
Linux 系统 SVN 源码安装与配置全流程指南
Linux系统SVN源码安装与配置全流程指南 一、环境准备 系统要求 CentOS 7及以上版本需安装GCC编译工具链 依赖项 APR/APR-UTIL(Apache可移植运行库)SQLite(嵌入式数据库)zlib(数据压缩库) 二、下载及安装…...
Redis 的五种数据类型面试回答
这里简单介绍一下面试回答、我之前有详细的去学习、但是一直都觉得太多内容了、太深入了 然后面试的时候不知道从哪里讲起、于是我写了这篇CSDN帮助大家面试回答、具体的深入解析下次再说 面试官你好 我来介绍一下Redis的五种基本数据类型 有String List Set ZSet Map 五种基…...
关于类模板STL中vector容器的运用和智能指针的实现
代码题:使用vector实现一个简单的本地注册登录系统 注册:将账号密码存入vector里面,注意防重复判断 登录:判断登录的账号密码是否正确 #include <iostream> #include <cstring> #include <cstdlib> #in…...
Opencv计算机视觉编程攻略-第十一节 三维重建
此处重点讨论在特定条件下,重建场景的三维结构和相机的三维姿态的一些应用实现。下面是完整投影公式最通用的表示方式。 在上述公式中,可以了解到,真实物体转为平面之后,s系数丢失了,因而无法会的三维坐标,…...
git修改已经push的commit的message
1.修改信息 2.修改message 3.强推...
2026考研数学张宇武忠祥复习视频课,高数基础班+讲义PDF
2026考研数学武忠祥老师课(网盘):点击下方链接 2026考研数学武忠祥网课(最新网盘) 一、基础阶段(3-5个月) 目标:搭建知识框架掌握基础题型 教材使用: 高数:…...
C++使用Qt Charts可视化大规模点集
引言 数据可视化是数据分析和决策过程中的重要环节。随着数据量的不断增长,如何高效地可视化大规模数据集成为了一个挑战。Qt Charts 提供了一个强大的工具集,用于创建直观的数据可视化图表。本文将探讨如何使用 C 和 Qt Charts 可视化大规模点集&#…...
Java观察者模式详解
观察者模式详解 一、观察者模式概述 观察者模式(Observer Pattern)是一种行为型设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会自动收到通知并更新。 核心特点 松耦合:主题和…...
Pytorch torch.utils.data.dataloader.default_collate 介绍
torch.utils.data.dataloader.default_collate 是 PyTorch 中 DataLoader 默认的 collate_fn 函数,用于将一个批次的样本数据合并成张量(Tensor)或其他结构化数据格式。以下是关于 default_collate 的详细介绍: 1. 功能 default…...
质检LIMS系统在生态修复企业的实践 生态修复行业的质量管控难题
一、生态修复行业的质量管控新命题 在生态文明建设的大背景下,生态修复企业面临着复杂的环境治理挑战。土壤改良、水体净化、植被恢复等工程,均需以精准的实验数据支撑决策。传统实验室管理模式存在数据孤岛、流程非标、合规风险高等痛点,而…...
Spring Cloud之服务入口Gateway之Route Predicate Factories
目录 Route Predicate Factories Predicate 实现Predicate接口 测试运行 Predicate的其它实现方法 匿名内部类 lambda表达式 Predicate的其它方法 源码详解 代码示例 Route Predicate Factories The After Route Predicate Factory The Before Route Predicate Fac…...
《AI大模型应知应会100篇》第6篇:预训练与微调:大模型的两阶段学习方式
第6篇:预训练与微调:大模型的两阶段学习方式 摘要 近年来,深度学习领域的一个重要范式转变是“预训练-微调”(Pretrain-Finetune)的学习方式。这种两阶段方法不仅显著提升了模型性能,还降低了特定任务对大…...
Jetpack Compose 自定义组件完全指南
Jetpack Compose 自定义组件完全指南 Compose 的声明式 UI 范式为创建自定义组件提供了前所未有的灵活性。本指南将带你从基础到高级全面掌握 Compose 自定义组件的开发技巧。 一、自定义组件基础 1.1 基本结构 一个最简单的自定义组件: Composable fun Greeti…...
java后端对时间进行格式处理
时间格式处理 通过java后端,使用jackson库的注解JsonFormat(pattern "yyyy-MM-dd HH:mm:ss")进行格式化 package com.weiyu.pojo;import com.fasterxml.jackson.annotation.JsonFormat; import lombok.AllArgsConstructor; import lombok.Data; import …...
汽车BMS技术分享及其HIL测试方案
一、BMS技术简介 在全球碳中和目标的战略驱动下,新能源汽车产业正以指数级速度重塑交通出行格局。动力电池作为电动汽车的"心脏",其性能与安全性不仅直接决定了车辆的续航里程、使用寿命等关键指标,更深刻影响着消费者对电动汽车的…...
【Code】《代码整洁之道》笔记-Chapter3-函数
第3章 函数 在编程的早期岁月,系统由程序和子程序组成。后来,到Fortran和PL/1的年代,系统由程序、子程序和函数组成。如今,只有函数存活下来。函数是所有程序中的第一组代码。本章将讨论如何写好函数。 请看代码清单3-1。在Fit…...
【TI MSPM0】CMSIS-DSP库学习
一、什么是CMSIS-DSP库 基于Cortex微控制器软件接口标准的数字信号处理的函数库 二、页面概览 这个用户手册用来描述CMSIS-DSP软件的函数库,有通用的计算处理函数给Cortex-M和Cortex-A的处理器使用 三、工程学习 1.导入工程 2.样例介绍 在Q15的格式下,…...
Vue3:初识Vue,Vite服务器别名及其代理配置
一、创建一个Vue3项目 创建Vue3项目默认使用Vite作为现代的构建工具,以下指令本质也是通过下载create-vue来构建项目。 基于NodeJs版本大于等于18.3,使用命令行进行操作。 1、命令执行 npm create vuelatest输入项目名称 2、选择附加功能 选择要包含的功…...
音频接口格式与通道
IEC 60958-3 文档结构概览(通俗版) 对于初学者来说,IEC 60958-3 的文档就像一个“数字音频传输的说明书”。它告诉设备如何把声音变成一堆0和1,再通过这些0和1的排列规则,让接收设备准确还原声音。 1. 接口格式&#…...
JS中的WeakMap
WeakMap weakmap是一种类似map的类型,但它的key是弱引用,并且key只能是对象。 weakmap和map的区别 weakmap的key只能是对象,value可以是任何值 const weakMap new WeakMap(); // 创建WeakMap实例const key1 "key1"; // 字符…...
Go语言类型捕获及内存大小判断
代码如下: 类型捕获可使用:reflect.TypeOf(),fmt.Printf在的%T。 内存大小判断:len(),unsafe.Sizeof。 package mainimport ("fmt""unsafe""reflect" )func main(){var i , j 1, 2f…...
学透Spring Boot — 017. 处理静态文件
这是我的《学透Spring Boot》专栏的第17篇文章,了解更多内容请移步我的专栏: Postnull CSDN 学透 Spring Boot 目录 静态文件 静态文件的默认位置 通过配置文件配置路径 通过代码配置路径 静态文件的自动配置 总结 静态文件 以前的传统MVC的项目…...
ARK no NIGHTS
《昨夜圆车》(ARK no NIGHTS) 于 2025 年 4 月 1 日 16:00 开服。在这款游戏中,玩家将扮演博士,带领整合运动击败罗德岛。FloorWinter 非常期待第一时间体验这款船新的游戏,于是他决定昏睡过去,直到游戏开服再醒来。 游戏开服的时…...
CMake实战指南一:add_custom_command
CMake 进阶:add_custom_command 用法详解与实战指南 在 CMake 构建系统中,add_custom_command 是一个灵活且强大的工具,允许开发者在构建流程中插入自定义操作。无论是生成中间文件、执行预处理脚本,还是在目标构建前后触发额外逻…...
指纹浏览器技术架构解析:高并发批量注册业务的工程化实践——基于分布式指纹引擎与防关联策略的深度实现
一、技术背景与行业痛点 在跨境电商、广告投放、问卷调查等场景中,批量注册与多账号矩阵运营已成为刚需。然而,主流平台(如亚马逊、Facebook、Google)的风控系统通过浏览器指纹追踪(Canvas/WebGL/WebRTC等)…...
懂x帝二手车数据爬虫-涉及简单的字体加密,爬虫中遇到“口”问题的解决
#脚本如下 import requests import pprint import timeurl https://www.dongchedi.com/motor/pc/sh/sh_sku_list?aid1839&app_nameauto_web_pc headers {User-Agent: Mozilla/5.0 }font_map {58425: 0, 58700: 1, 58467: 2, 58525: 3,58397: 4, 58385: 5, 58676: 6, 58…...
4.7学习总结 java集合进阶
集合进阶 泛型 //没有泛型的时候,集合如何存储数据 //结论: //如果我们没有给集合指定类型,默认认为所有的数据类型都是object类型 //此时可以往集合添加任意的数据类型。 //带来一个坏处:我们在获取数据的时候,无法使用他的特有行为。 //此…...
Python高阶函数-eval深入解析
1. eval() 函数概述 eval() 是 Python 内置的一个强大但需要谨慎使用的高阶函数,它能够将字符串作为 Python 表达式进行解析并执行。 基本语法 eval(expression, globalsNone, localsNone)expression:字符串形式的 Python 表达式globals:可…...
