Java 使用JVMTI跟踪线程感知的堆分配
编写一个分析,我还将实现堆分析的典型任务。我特别想跟踪,哪个线程分配了多少数据?使用JVMTI,我认为挂钩到事件VM对象分配和对象自由就足够了。遗憾的是,我读到第一个事件由于调用Java 使用JVMTI跟踪线程感知的堆分配,java,jvmti,Java,Jvmti,编写一个分析,我还将实现堆分析的典型任务。我特别想跟踪,哪个线程分配了多少数据?使用JVMTI,我认为挂钩到事件VM对象分配和对象自由就足够了。遗憾的是,我读到第一个事件由于调用new而未触发 我的最后一个想法是检查event MethodExit的名称是否为,从而将此调用声明为对象分配。但是,在此事件中,我无法获取对象,因此无法调用GetObjectSize 只需在堆上迭代,就不包含关于哪个线程分配了哪个对象的信息。有人知道如何实现这一点吗?快速浏览一下Hotspot VM(templateT
new
而未触发
我的最后一个想法是检查event MethodExit的名称是否为
,从而将此调用声明为对象分配。但是,在此事件中,我无法获取对象,因此无法调用GetObjectSize
只需在堆上迭代,就不包含关于哪个线程分配了哪个对象的信息。有人知道如何实现这一点吗?快速浏览一下Hotspot VM(templateTable_x86_64.cpp)的新实现似乎表明,它没有为JVMTI提供任何挂钩(即使是在看起来很慢的情况下)。所以,如果你的技巧不起作用,我看不到任何其他可能性——但我决不是JVMTI的专家
我想用一个小补丁编译你自己的Hotspot VM对你来说不是特别有用吧 有什么原因不能从构造函数的
MethodEntry
事件调用GetObjectSize
如果您对在方法返回之前执行代码感兴趣,则可以侦听MethodEntry
事件,如果该方法名为
,则可以调用NotifyFramePop
来侦听当前帧的FramePop
事件。此事件类似于MethodExit
事件,但发生在方法返回之前,因此您仍然可以获取This
对象。这说明了如何跟踪堆中的所有对象。
因为只有在反射发生时才会发送,所以演示使用ByteCodeInstrument来跟踪新的对象分配。
您可以使用getCurrentThread函数来知道对象属于哪个线程。否,因为我正在编写自己的通用JVM探查器。虽然感谢你调查它+1,但这只是证实了我的怀疑。