使用JVMTI进行线程感知堆分配跟踪

时间:2011-06-16 00:32:29

标签: java jvmti

编写分析我还将实现堆分析的典型任务。具体我想跟踪,哪个线程分配了多少数据?使用JVMTI我认为挂钩事件 VM Object Allocation Object Free 就足够了。可悲的是,我读到第一个事件是由于拨打new而没有触发的。

我的最后一个想法是检查事件 MethodExit ,如果它的名称是<init>,那么将此调用声明为对象分配。但是,在这个事件中我无法获取对象,因此我无法调用GetObjectSize

简单地在堆上迭代,没有关于哪个对象由哪个线程分配的信息。有没有人知道如何实现这个?

3 个答案:

答案 0 :(得分:2)

快速浏览一下Hotspot VM的新实现(templateTable_x86_64.cpp)似乎表明,_new没有为JVMTI提供任何钩子(即使在看起来很慢的情况下也是如此)。所以,如果你的技巧不起作用,我看不到任何其他可能性 - 但我绝不是JVMTI的专家。

我假设用一个小补丁编译你自己的Hotspot VM对你来说特别有用吗?

答案 1 :(得分:2)

是否有某些原因导致您无法从GetObjectSize事件中为构造函数调用MethodEntry

如果您对方法返回之前执行代码感兴趣,那么您可以侦听MethodEntry事件,如果方法名为<init>,则可以调用NotifyFramePop侦听当前帧的FramePop事件。此事件类似于MethodExit事件,但在方法返回之前发生,因此您仍然可以获取this对象。

答案 2 :(得分:2)

这个heapTracker demo说明了如何跟踪堆中的所有对象。 因为VMObjectAlloc Event仅在发生反射时发送,所以演示使用ByteCodeInstrument来跟踪新的对象分配。

<小时/> 您可以使用getCurrentThread函数来了解该对象属于哪个线程。