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

3
我将实现堆分析的典型任务,其中包括跟踪哪个线程分配了多少数据。使用JVMTI,我认为挂钩到VM对象分配对象释放事件就足够了。遗憾的是,由于对new的调用,第一个事件不会被触发。
我最后想到的办法是检查MethodExit事件是否其名称为<init>,从而将此调用声明为对象分配。然而,在此事件中,我无法获取对象,因此无法调用GetObjectSize
简单地迭代堆并没有关于哪个对象由哪个线程分配的信息。有人有什么想法如何实现这个吗?
3个回答

3
这个heapTracker演示向您展示如何跟踪堆中的所有对象。 因为只有在发生反射时才会发送VMObjectAlloc事件,所以该演示使用ByteCodeInstrument来跟踪新对象分配。
您可以使用getCurrentThread函数来了解对象属于哪个线程。

3

快速浏览Hotspot VM的_new实现(templateTable_x86_64.cpp),似乎表明_new不提供任何JVMTI挂钩(甚至在慢速情况下也是如此)。因此,如果您的技巧不起作用,我看不到其他可能性 - 但我绝不是JVMTI的专家。

我假设为自己编译带有小补丁的Hotspot VM对您来说并不特别有用?


不,因为我正在编写自己的通用JVM分析器。虽然感谢您的关注和支持 +1 这只是证实了我的怀疑。 - Konrad Reiche

2

你为什么不能在构造函数的MethodEntry事件中调用GetObjectSize

如果你想在方法返回之前执行代码,则可以监听MethodEntry事件,如果该方法命名为<init>,则可以调用NotifyFramePop来监听当前帧的FramePop事件。此事件类似于MethodExit事件,但发生在方法返回之前,因此仍然可以获取this对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接