导航菜单

婴儿奶粉质量排行榜-全链路监控柱石之java探针技能学习与实践

一、JavaAgent

发动时加载的 JavaAgent 是 JDK1.5 之后引进的新特性,供给了在 JVM 将字节码文件读入内存之后,JVM 运用对应的字节流在 Java 堆中生成一个 Class 方针之前,能够对其字节码进行修正的才能,然后 JVM 也将会运用用户修正过之后的字节码进行 Class 方针的创立。

  • 能够在加载 class 文件之前做阻拦,对字节码做修正
  • 能够在运转期对已加载类的字节码做改动,可是这种情况下会有许多的约束,后面会详细说
  • 还有其他一些小众的功用
    • 获取一切现已加载过的类
    • 获取一切现已初始化过的类(履行过 clinit 办法,是上面的一个子集)
    • 获取某个方针的巨细
    • 将某个 jar 加入到 bootstrap classpath 里作为高优先级被 bootstrapClassloader 加载
    • 将某个 jar 加入到 classpath 里供 AppClassloard 去加载
    • 设置某些 native 办法的前缀,主要在查找 native 办法的时分做规矩匹廉租房配

JVM Tool Interface

JVMTI 是 JVM 露出出来的一些供用户进行自界说扩展的接口调集,每逢 jvm 履行到一些特定的逻辑的时刻,就会去进行触发这些回调接口,用户就刚好能够在此回调接口之中做一些自界说逻辑。

而对于此次所要描绘的 JavaAgent 也恰恰是根据 JVMTI 的,JPLISAgent 便是用作完成 javaagent 功用的动态库。

JPLISAgent

JPLISAgent 是一个动态库,运用 JVMTI 露出出来的一些接口来干一些咱们想做、可是正常情况下又做不到的工作。

  • Agent_OnLoad函数,假如 agent 是在发动时加载的,也便是在 vm 参数里经过 -agentlib 来指定的,那在发动进程中就会去履行这个 agent 里的Agent_OnLoad函数。
  • Agent_OnAttach函数,假如 agent 不是在发动时加载的,而是咱们先 attach 到方针进程上,然后给对应的方针进程发送 load 指令来加载,则在加载进程中会调用Agent_OnAttach函数。
  • Agent_OnUnload函数,在 agent 卸载时调用,不过形似基本上很少完成它。

instrument agent

instrum婴儿奶粉质量排行榜-全链路监控柱石之java探针技能学习与实践ent agent 完成了Agent_OnLoad和Agent_OnAttach两办法,婴儿奶粉质量排行榜-全链路监控柱石之java探针技能学习与实践也便是说在运用时,agent既能够在发动时加载,也能够在运转时动态加载。其间发动时加载还能够经过相似-javaagent:myagent.jar的办法来直接加载 instrument agent,运转时动态加载依靠的是 JVM 的 attach 机制,经过发送 load 指令来加载婴儿奶粉质量排行榜-全链路监控柱石之java探针技能学习与实践 agent。

二、javaagent实践

1、编写premain发动类:

2、阻拦器

3、MA婴儿奶粉质量排行榜-全链路监控柱石之java探针技能学习与实践INIFEST.MF

Manifest-Version: 1.0

Premain-Class: cn.zhaosoft.learning.bytebuddy.Agent

Can-Redefine-Classes: true

4、测验办法

履行时,在发动指令行上加上:-javaagent:/target/agent.jar 参数

三、javaagent其他功用

javaagent除了做字节码上面的修正之外,其实还有一些小功用,有时分仍是挺有用的

  • 获取一切现已被加载的类:Class[] getAllLoadedClasses();
  • 获取一切现已初始化了的类: Class[] getInitiatedClasses(ClassLoader loader);
  • 获取某个方针的巨细: long getObjectSize(Object objectToSize);
  • 将某个jar加入到bootstrap classpath里优先其他jar被加载: void appendToBootstrapClassLoaderSearch(JarFile jarfile);
  • 将某个jar加入到classpath里供appclassloard去加载:void appendToSystemClassLoaderSearch(JarFile jarfile);
  • 设置某些native办法的前缀,主要在找native办法的时分做规矩匹配: void setNativeMethodPrefix(ClassFileTransformer transformer, String prefix)。

四、字节码东西

Byte Buddy

Byte Buddy是一个代码生成库,经过简略的Java API界说新类或修正现有类。这个字节码工程库会生成并操作java字节码。经过处理节码工程库,它能够与运用任何JVM言语编写的代码进行交互,节码工程库,并且能够在Java应用程序的运转期间运用该字节码工程库来修正当时要履行的代码,乃至包含自己的代码。婴儿奶粉质量排行榜-全链路监控柱石之java探针技能学习与实践

Javassist

Javassist是一个开源的剖析、修改和创立Java字节码的类库。是由东京工业大学的数学和计算机科学系的 Shigeru Chiba (千叶 滋)所创立的。它已加入了开放源代码JBoss 应用服务器项目,经过运用Javassist对字节码操作为JBoss完成动态AOP结构。javassist是jboss的一个子项目,其主要的长处,在于简略,并且快速。直接运用java编码的方式,而不需要了解虚拟机指令,就能动态改动类的结构,或许动态生成类。

二维码