Javaagent Introduction

原创
2019/05/04 11:34
阅读数 57

问题: javaagent 可以做什么?

可以在加载class文件之前做拦截把字节码做修改 可以在运行期将已经加载的类的字节码做变更,但是这种情况下会有很多的限制,后面会详细说 还有其他的一些小众的功能: 获取所有已经被加载过的类 获取所有已经被初始化过了的类(执行过了clinit方法,是上面的一个子集) 获取某个对象的大小 将某个jar加入到bootstrapclasspath里作为高优先级被bootstrapClassloader加载 将某个jar加入到classpath里供AppClassloard去加载 设置某些native方法的前缀,主要在查找native方法的时候做规则匹配

如何获取Instrument的示例?

public static void premain(String agentArgs, Instrumentation inst);
public static void agentmain(String agentArgs, Instrumentation inst);

为什么需要从agent里获取Instrument的实例?

看下Instrument 的实现类InstrumentIml 构造函数是私有的,另外这个类在rt.jar下面,会被系统加载器加载; 让后就会执行:


/**
* Loads the native library specified by the <code>libname</code>
* argument.
*/
 static {
        System.loadLibrary("instrument");
    }

现在知道的,这个实现类里的native方法是由 “instrument” 本地库实现的。 但是还是不知道怎么实例化的InstrumentImpl.我们猜测是由JNI来创建java实例的。问题又来了,native 内存是怎么分配的,如果分配到堆外要怎么访问呢?

javaagent的class是怎么加载的? The system class loader ( ClassLoader.getSystemClassLoader) must support a mechanism to add an agent JAR file to the system class path.

native 方法是如何执行的? 调用本地库

那我们从JVMTI里找答案。 IBM JMTI

最后是why?

参考:

Instrument interface

ClassFileTransformer

java jar file

java agent

JVMTI

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部