如何拦截Java中的对象创建低于用户类级别

Jig*_*shi 10 java jvm

我正在寻找一些方法,通过使用Java代理或仪器类(最好是比用户类更低级别的东西)拦截JVM中的所有对象创建(new或任何其他创建Object的方法),有一个类似的问题,它没有专注于Java代理或低于检测用户类的东西

apa*_*gin 17

可以通过几种不同的方式创建Java对象.

  1. 从Java代码,当一个Java方法,无论是解释或编译,执行下列字节码指令之一:new,newarray,anewarray,multianewarray.
  2. 从本机代码,当本机方法,包括那些在标准类库,调用JNI功能之一:NewObject,NewObjectArray,NewStringUTF,NewDirectByteBuffer,等.
  3. 直接从VM的运行时,当一个新的对象被JVM内部创建,例如,响应于Object.clone(),Throwable.getStackTrace(),Class.getInterfaces()等.

不幸的是,没有一点可以从所有这些来源收集对象.但是,有办法拦截所有这些.

  1. 从Java实例化的对象可以由Instrumentation代理捕获.代理需要定义一个ClassFileTransformer,它将扫描所有已加载类的字节码以获取对象创建指令并对其进行修改.

    注意:没有必要拦截所有new指令,你可以Object()改用仪器构造函数.但是你仍然需要拦截数组分配指令.

  2. JVMI代理可以拦截JNI函数.您需要为等等定义自己的本机挂钩NewObjectArray,NewStringUTF然后替换JNI函数表.有关详细信息,请参阅JVMTI参考.

  3. 由VM创建的对象可以由JVMTI事件回调机制捕获.所需的事件是VMObjectAlloc.

    注意:JVM不会VMObjectAlloc为从Java或JNI函数分配的对象发布事件.

对象实例化(克隆,反射,反序列化)的所有其他方式都属于上述类别之一.


从Oracle Java SE下载网站获取JDK 8演示和示例.
对于这个问题,有一个示例JVMTI代理.

看下

  • jvmti/heapTracker
  • jvmti/hprof