当前位置: 首页 > news >正文

网站基本要素中国建筑装饰网官网

网站基本要素,中国建筑装饰网官网,wordpress调用实际那,小制作饮水机转载自 一文带你了解Java Agent Java Agent这个技术#xff0c;对于大多数同学来说都比较陌生#xff0c;像个黑盒子。但是多多少少又接触过#xff0c;实际上#xff0c;我们平时用的很多工具#xff0c;都是基于Java Agent实现的#xff0c;例如常见的热部署JRebel对于大多数同学来说都比较陌生像个黑盒子。但是多多少少又接触过实际上我们平时用的很多工具都是基于Java Agent实现的例如常见的热部署JRebel各种线上诊断工具btrace, greys还有阿里最近开源的arthas。 其实Java Agent一点都不神秘也是一个Jar包只是启动方式和普通Jar包有所不同对于普通的Jar包通过指定类的main函数进行启动但是Java Agent并不能单独启动必须依附在一个Java应用程序运行有点像寄生虫的感觉。 如何动手写一个Java Agent 因为Java Agent的特殊性需要一些特殊的配置在META-INF目录下创建MANIFEST文件. 并在MANIFEST文件中指定Agent的启动类 这里需要解释下为什么要指定 Agent-Class和 Premain-Class在加载Java Agent之后会找到 Agent-Class或者 Premain-Class指定的类并运行对应的 agentmain或者 premain方法。 /** * 以vm参数的方式载入在Java程序的main方法执行之前执行 */ public static void premain(String agentArgs, Instrumentation inst);/** * 以Attach的方式载入在Java程序启动后执行 */ public static void agentmain(String agentArgs, Instrumentation inst); 如果不想手动创建MANIFEST文件也可以通过Maven配置在打包的时候自动生成具体配置可以参数下面。 pluginartifactIdmaven-assembly-plugin/artifactIdconfigurationarchivemanifestEntriesPremain-Classcom.dianping.rhino.agent.AgentBoot/Premain-ClassAgent-Classcom.dianping.rhino.agent.AgentBoot/Agent-ClassCan-Redefine-Classestrue/Can-Redefine-ClassesCan-Retransform-Classestrue/Can-Retransform-Classes/manifestEntries/archive/configuration /plugin 所以我们需要在 agentmain或者 premain方法中实现具体的Agent逻辑这里是你大显身手的地方读取JVM的各种数据修改类的字节码只要你能想到的一般都可以实现。 如何加载 Java Agent 前面说了一个Java Agent既可以在程序运行前加载也可以在程序运行后加载两者有什么区别呢 程序运行前加载 通过JVM参数 -javaagent:**.jar启动程序启动的时候会优先加载Java Agent并执行其 premain方法这个时候其实大部分的类都还没有被加载这个时候可以实现对新加载的类进行字节码修改但是如果 premain方法执行失败或抛出异常那么JVM会被中止这是很致命的问题。 程序运行后加载 程序启动之后通过某种特定的手段加载Java Agent这个特定的手段就是 VirtualMachine的 attach api这个api其实是JVM进程之间的的沟通桥梁底层通过socket进行通信JVM A可以发送一些指令给JVM BB收到指令之后可以执行对应的逻辑比如在命令行中经常使用的jstack、jcmd、jps等很多都是基于这种机制实现的。 因为是进程间通信所以使用 attach api的也是一个独立的Java进程下面是一个简单的实现。 // 15186表示目标进程的PID VirtualMachine vm VirtualMachine.attach(15186);  try {// 指定Java Agent的jar包路径vm.loadAgent(.../agent.jar);    } finally {vm.detach();} 首先我们得知道目标进程的PID这个可以通过jps指令方便得到也可以通过 VirtualMachine的list方法拿到本机所有Java进程的PID。通过 attach连接上目标PID之后可以获得表示目标进程的vm对象执行 loadAgent方法对应的Java Agent会被加载然后会找到指定的入口类并执行agentmain方法如果执行出现普通异常除了oom和其它致命异常目标JVM并不会受到影响。 通过这种方式可以实现动态的加载Java Agent而不需要修改JVM启动参数。 后续内容 attach api 的实现原理agentmain 和 premain方法中的Instrumentation参数是什么如何自定义类加载器避免污染目前进程如何实现字节码的修改如何实现字节码的多次修改如何恢复被修改过的字节码如何卸载Java Agent的类卸载自定义类加载器遇到的一些坑
http://wiki.neutronadmin.com/news/24969/

相关文章:

  • 建网站软件哪个好南宁网站如何制作
  • 怎么做学校官方网站永久免费国外vps无需信用卡
  • 国内最先做弹幕的网站济宁正德网站建设
  • 视频网站建设框架wordpress 不发送邮件
  • 百度怎么做网站网页设计教程
  • 特色专业建设验收网站18款禁用黄app入口直接看
  • 医疗网站建设及优化方案购买已备案网站做非法
  • 自己做的网站如何在百度被搜索到网页设计代码大全表单
  • 基于html的网站设计网站设计所用的软件
  • 哪里可以做购物网站织梦dedecms导航网站源码
  • 美橙建站怎么样外贸网络推广高手何在
  • 网页设计资料下载网站海外短视频软件
  • 北京市网上服务平台登录在线优化工具
  • 做爰全过程免费的视频凤凰网站在线微信小程序
  • 网站名称要求吸引企业做网站的文章内容
  • 做贺卡 网站做网站的客户在哪找
  • 做app还是做网站合适6静态网站设计怎么做
  • 宁夏住房和城乡建设厅门户网站附近图文广告公司电话
  • 做网站的常识网站建设制作教程
  • 商城网站需要注意事项赣州门户网站建设
  • 网站设计是干什么的网站备案的账号找不到
  • 中砼建设有限公司网站建设银行如何招聘网站
  • 创建网站怎么弄制作介绍的网站模板
  • 网站标头图片切换民治网站建设公司
  • 网站推广的软文深圳建设交易宝安
  • 江西那家做网站公司好小程序开发平台要多少钱
  • 免费 网站模板网站如何添加统计代码
  • 铜仁市网站建设服装加工平台
  • 个人怎么做一个网站集团做网站
  • 2018做网站 工具程序源码网站