java agent简介

  1. 主要就是两种,一种的方法是premain,一种是agentmain。这两种的区别是:

    1. premain是在jvm启动的时候类加载到虚拟机之前执行的
    2. agentmain是可以在jvm启动后类已经加载到jvm中了,才去转换类。这种方式会转换会有一些限制,比如不能增加或移除字段。
  2. 具体的做法,两者的实际做法是差不多的:

    1. 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)

    2. 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)

  3. 具体类的转换处理一般都是用asm之类修改字节码的开源组件。主要就是实现ClassFileTransformer接口,对入参的byte[]这个就是class类的字节数组了,对这个进行转换,返回新的class类的byte[]字节数组

  4. 看看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简介相关推荐

  1. java agent简介热部署SDK接入

    思考: 我们在平时使用arthas的类方法监控,类增强,到底是怎么在应用启动后还能对类进行修改的呢,他到底是基于什么场景下孕育出来的呢,今天我们就来聊一聊java-agent,当了解完了agent机制 ...

  2. Java Agent简介及使用Byte Buddy和AspectJ LTW监控方法执行耗时

    1.什么是Java Agent Java Agent提供了一种在加载字节码时,对字节码进行修改的方法.一共有两种方式执行:一种是在main方法执行之前,通过premain来实现:另一种是在程序运行中, ...

  3. 写那么多年Java,还不知道啥是Java agent 的必须看一下!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者信息:张帅,花名洵澈,国际化中台事业部高级开发工程师,负责物流 ...

  4. 我的天,你工作5年了,连Java agent都不知道...

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 # 引言 在本篇文章中,我会通过几个简单的程序来说明 agent ...

  5. Java agent初探

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"加群"获取公众号专属群聊入口 来源:阿里巴巴中间件 在本篇文章中,我会通过几个简单的程 ...

  6. 基于Java Agent实现APM

    一.APM概述 APM系统(Application Performance Management,即应用性能管理),用于对应用系统做实时监控,目的是实现对应用性能管理和故障定位. 1.1.为什么需要A ...

  7. Java agent 探针技术(1)-JVM 启动时 premain 进行类加载期增强

    文章目录 1. 简介 2. 使用 Java agent 的步骤 3. 使用示例 3.1 创建实现 ClassFileTransformer 接口的类 3.2 创建使用 ClassFileTransfo ...

  8. Java Agent介绍及其使用

    一.简介 Java Agent技术,也被称为Java代理.Java探针,它允许程序员利⽤其构建⼀个独⽴于应⽤程序的代理程序. Java Agent 本质上就是一个 jar 包,对于普通的Jar包,通过 ...

  9. Java Agent 调试,Java agent debug

    Java Agent 调试,agent debug 一.简介 Java agent 是在另外一个 Java 应用("目标"应用)启动之前要执行的 Java 程序,这样 agent ...

最新文章

  1. 特约专栏丨陈纯院士:大规模动态时序图实时处理技术、平台及应用
  2. 大型网站技术架构(八)网站的安全架构
  3. 文本深度表示模型Word2Vec
  4. Android各种报错问题汇总
  5. 成功解决sub_div.insert(points)cv2.error: OpenCV(3.4.1) C:\projects\opencv-python\opencv\modules\imgproc
  6. 为什么本地使用js或jquery操作cookie在谷歌浏览器chrome中不生效?
  7. php curl cookie,php中curl获取返回页面的cookie
  8. Hadoop HIVE 关联查询
  9. ServletContext、ServletConfig(FilterConfig)学习笔记
  10. AbstractQueuedSynchronizer源码
  11. 【java学习之路】(数据结构篇)003.链表
  12. 随机森林回归简单示例
  13. 小米air耳机重新配对_小米air耳机重新配对_「小三爷出品」不错的新年礼物,小米蓝牙耳机Air体验...
  14. 来西安必看的旅游攻略!看过来,带你玩转西安!
  15. 解决 chrome 启动时强制打开2345导航(或其他网址)的方法
  16. 磁盘阵列(RAID)级别的简单介绍
  17. 前端下载 “不支持打开该类型文件或文件已损坏“问题
  18. 简单的SQL注入攻击
  19. 安兔兔电脑ssd测试软件,威钰战国NVMe SSD测评,安兔兔SSD测试软件到底靠不靠谱...
  20. iNotePad流氓软件卸载

热门文章

  1. 还在用机械式的继电器?要不试下这款光电固态继电器?
  2. 日本电子货币用户数今夏有望突破一亿
  3. 淘宝店铺运营 打造小而美店铺运营方案
  4. 00014__广州市来穗人员积分制服务管理申办指南
  5. mysql count的子查询_使用COUNT进行子查询的慢MYSQL查询
  6. 抓取服务器作业文档不存在,易飞ERP客户问题集.doc
  7. ADC0804工作原理
  8. PCI、CPCI、CPCIE 区别、特点
  9. Java 开源开发平台 O2OA V7.3 发布,新增带权限的全文检索等重要功能
  10. 如何选择O2OA(翱途)开发平台的部署架构?