Java 使用JVMTI跟踪线程感知的堆分配

Java 使用JVMTI跟踪线程感知的堆分配,java,jvmti,Java,Jvmti,编写一个分析,我还将实现堆分析的典型任务。我特别想跟踪,哪个线程分配了多少数据?使用JVMTI,我认为挂钩到事件VM对象分配和对象自由就足够了。遗憾的是,我读到第一个事件由于调用new而未触发 我的最后一个想法是检查event MethodExit的名称是否为,从而将此调用声明为对象分配。但是,在此事件中,我无法获取对象,因此无法调用GetObjectSize 只需在堆上迭代,就不包含关于哪个线程分配了哪个对象的信息。有人知道如何实现这一点吗?快速浏览一下Hotspot VM(templateT

编写一个分析,我还将实现堆分析的典型任务。我特别想跟踪,哪个线程分配了多少数据?使用JVMTI,我认为挂钩到事件VM对象分配和对象自由就足够了。遗憾的是,我读到第一个事件由于调用
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,但这只是证实了我的怀疑。