java agent简介
java agent简介
主要就是两种,一种的方法是premain,一种是agentmain。这两种的区别是:
- premain是在jvm启动的时候类加载到虚拟机之前执行的
- agentmain是可以在jvm启动后类已经加载到jvm中了,才去转换类。这种方式会转换会有一些限制,比如不能增加或移除字段。
具体的做法,两者的实际做法是差不多的:
premain
定义个静态方法
public static void premain(String args, Instrumentation inst)
,在生成jar包中MANIFEST.MF文件中需要有
Premain-Class: xxx.xxx
,xxx.xxx就是上面premain方法所在的类名在java 的启动参数中添加 -javaagent:/jar包路径[=agentArgs]
这样定义了后jvm启动时,就会去加载javaagent中指定的jar包,查找MANIFEST.MF文件中Premain-Class属性的类,执行premain方法。
参考asm文档简单修改了下打印方法执行时间的demo
blogdemo/javabasedemo/agentdemo at main · wbo112/blogdemo (github.com)
agentmain
定义个静态方法
public static void agentmain(String agentOps, Instrumentation instrumentation)
,在生成jar包中MANIFEST.MF文件中需要有Agent-Class: xxx.xxx (xxx.xxx就是上面agentmain方法所在的类名)
Can-Retransform-Classes: true使用下面代码,将agent添加到指定java进程
vm = VirtualMachine.attach(pid);try {vm.loadAgent("D:\\tmp\\my-java-agent-1.0-jar-with-dependencies.jar", null);} finally {vm.detach();}
这个github找到一个很不错的案例。wujiuye/bytecode-book: 《Java虚拟机字节码从入门到实战》一书的配套代码 (github.com)
具体类的转换处理一般都是用asm之类修改字节码的开源组件。主要就是实现ClassFileTransformer接口,对入参的byte[]这个就是class类的字节数组了,对这个进行转换,返回新的class类的byte[]字节数组
看看arthas中的使用
我们在启动arthas的时候加上
--debug-attach
参数,我们就能通过debug的方式看到attach到java进程的代码。默认调试端口是8888这个时候就会暂停住,等待我们去debug连接,整个的启动命令行用ps命令也能看到,我本地看到的是这样
/root/software/jdk1.8.0_291/bin/java -Xbootclasspath/a:/root/software/jdk1.8.0_291/lib/tools.jar -agentlib:jdwp=transport=dt_socket,address=8888,server=y,suspend=y -Djava.awt.headless=true -jar /root/software/demo/arthas-bin/arthas-core.jar -pid 126336 -core /root/software/demo/arthas-bin/arthas-core.jar -agent /root/software/demo/arthas-bin/arthas-agent.jar
本地idea 通过debug连上就可以了
上面有个attachAgent方法,里面也调用上面说的 VirtualMachine.attach(pid); vm.loadAgent();virtualMachine.detach();方法
上面可以看到最终attache到我们java程序的其实是arthas-agent.jar。
我们看看它里面的关于agent的内容:
从上面的图上也能看到arthas嵌入程序的入口其实都是通过com.taobao.arthas.agent334.AgentBootstrap来完成的。
java agent简介相关推荐
- java agent简介热部署SDK接入
思考: 我们在平时使用arthas的类方法监控,类增强,到底是怎么在应用启动后还能对类进行修改的呢,他到底是基于什么场景下孕育出来的呢,今天我们就来聊一聊java-agent,当了解完了agent机制 ...
- Java Agent简介及使用Byte Buddy和AspectJ LTW监控方法执行耗时
1.什么是Java Agent Java Agent提供了一种在加载字节码时,对字节码进行修改的方法.一共有两种方式执行:一种是在main方法执行之前,通过premain来实现:另一种是在程序运行中, ...
- 写那么多年Java,还不知道啥是Java agent 的必须看一下!
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者信息:张帅,花名洵澈,国际化中台事业部高级开发工程师,负责物流 ...
- 我的天,你工作5年了,连Java agent都不知道...
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 # 引言 在本篇文章中,我会通过几个简单的程序来说明 agent ...
- Java agent初探
点击上方"朱小厮的博客",选择"设为星标" 后台回复"加群"获取公众号专属群聊入口 来源:阿里巴巴中间件 在本篇文章中,我会通过几个简单的程 ...
- 基于Java Agent实现APM
一.APM概述 APM系统(Application Performance Management,即应用性能管理),用于对应用系统做实时监控,目的是实现对应用性能管理和故障定位. 1.1.为什么需要A ...
- Java agent 探针技术(1)-JVM 启动时 premain 进行类加载期增强
文章目录 1. 简介 2. 使用 Java agent 的步骤 3. 使用示例 3.1 创建实现 ClassFileTransformer 接口的类 3.2 创建使用 ClassFileTransfo ...
- Java Agent介绍及其使用
一.简介 Java Agent技术,也被称为Java代理.Java探针,它允许程序员利⽤其构建⼀个独⽴于应⽤程序的代理程序. Java Agent 本质上就是一个 jar 包,对于普通的Jar包,通过 ...
- Java Agent 调试,Java agent debug
Java Agent 调试,agent debug 一.简介 Java agent 是在另外一个 Java 应用("目标"应用)启动之前要执行的 Java 程序,这样 agent ...
最新文章
- RMI中部署时要注意的地方
- 如何踩中下一个技术节拍
- docker 安装hadoop
- 数据库索引设计与优化pdf
- 3dmax软件怎么贴图
- 十字路口旁边有一个路口_观察路口观察员
- 第三十七课.宽度学习
- 校园一卡通管理信息系统的设计与实现(asp.net)
- 通过搭建FTP站点实现上传与下载
- Android系统音乐界面UI设计,40款音乐APP界面UI设计欣赏
- 哈耶克《感觉的秩序》导读
- pycharm2019+破解补丁
- edi mysql_EDI:_数据库基础(mysql)答案_学小易找答案
- tableau新新手指南(基础功能介绍)
- transition和transition的区别
- 利用iframe跨域请求
- 异丁酸酐(CAS 97-72-3)的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- Vue全家桶构建项目
- 前端三剑客:JavaScript
- 毕业答辩的流程是什么
热门文章
- puppeteer做页面监控
- 第一百零六期:长相不讨AI喜欢面试就会挂?全球百万求职者经历AI“看脸”面试
- 2022.12 青少年机器人技术等级考试理论综合试卷(一级)
- 团队管理课程培训心得(四)
- 网站漏洞检测之Discuz论坛 3.4版本
- IP RAN和PTN的区别——TFN TT60 综合网络测试仪
- 利用最小堆完成有理数的类定义以及有理数逻辑运算
- 前端插件,你不容错过
- 上海市计算机一级考试试题模拟,48-上海市高校计算机等级考试一级 模拟试题...
- LeakCanary