3

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

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

简单地遍历堆,不包含关于哪个对象由哪个线程分配的信息。有谁知道如何实现这个?

4

3 回答 3

3

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

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

于 2011-06-16T01:52:05.773 回答
3

这个heapTracker 演示向您展示了如何跟踪堆中的所有对象。因为只有在反射发生时才会发送 VMObjectAlloc 事件,所以演示使用 ByteCodeInstrument 来跟踪新的对象分配。


您可以使用 getCurrentThread 函数来了解对象属于哪个线程。

于 2014-12-02T08:34:16.690 回答
2

是否有某种原因您不能GetObjectSizeMethodEntry事件中调用构造函数?

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

于 2011-09-08T22:45:16.130 回答