[英]How to intercept object creation in Java lower than user class level
我正在寻找一些方法,通过使用Java代理或仪器类(最好是比用户类更低级别的东西)拦截JVM中的所有对象创建( new
或任何替代方法来创建Object),有一个类似的问题 ,它没有'重点关注Java代理或低于检测用户类的东西
可以通过几种不同的方式创建Java对象。
new
, newarray
, anewarray
, multianewarray
。 NewObject
, NewObjectArray
, NewStringUTF
, NewDirectByteBuffer
等。 Object.clone()
, Throwable.getStackTrace()
, Class.getInterfaces()
等。 不幸的是,没有一点可以从所有这些来源收集对象。 但是,有办法拦截所有这些。
从Java实例化的对象可以由Instrumentation代理捕获。 代理需要定义一个ClassFileTransformer ,它将扫描所有已加载类的字节码以获取对象创建指令并对其进行修改。
注意:没有必要拦截所有new
指令,可以改为使用Object()
构造函数。 但是你仍然需要拦截数组分配指令。
JVMI代理可以拦截JNI函数。 您需要为NewObjectArray
, NewStringUTF
等定义自己的本机挂钩,然后替换JNI函数表。 有关详细信息,请参阅JVMTI参考 。
由VM创建的对象可以由JVMTI事件回调机制捕获。 所需的事件是VMObjectAlloc 。
注意:JVM不会为从Java或JNI函数分配的对象发布VMObjectAlloc
事件。
对象实例化(克隆,反射,反序列化)的所有其他方式都属于上述类别之一。
从Oracle Java SE下载网站获取JDK 8演示和示例。
对于这个问题,有一个示例JVMTI代理。
看下
jvmti/heapTracker
jvmti/hprof
您可以查看由devexperts团队创建的这个opensource java代理https://github.com/Devexperts/aprof它提供了很好的报告来检测内存的分配位置。 但是,据我所知,它不拦截通过JNI或sun.misc.Unsafe.allocateInstance在当前版本中创建的新对象
它是纯java代理,它使用ASM操作字节码。 在每个对象分配之前,aprof会插入方法调用,该方法调用会分配大小和位置堆栈(发生此分配的位置)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.