前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java agent简介

java agent简介

作者头像
冬夜先生
修改2021-09-06 14:16:35
8660
修改2021-09-06 14:16:35
举报
文章被收录于专栏:csico
  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)

  1. 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(); }

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档