编写分析我还将实现堆分析的典型任务。具体我想跟踪,哪个线程分配了多少数据?使用JVMTI我认为挂钩事件 VM Object Allocation 和 Object Free 就足够了。可悲的是,我读到第一个事件是由于拨打new
而没有触发的。
我的最后一个想法是检查事件 MethodExit ,如果它的名称是<init>
,那么将此调用声明为对象分配。但是,在这个事件中我无法获取对象,因此我无法调用GetObjectSize
。
简单地在堆上迭代,没有关于哪个对象由哪个线程分配的信息。有没有人知道如何实现这个?
答案 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函数来了解该对象属于哪个线程。