编写分析我也会实现堆分析的典型任务。具体我想跟踪一下,哪个线程分配了多少数据?使用 JVMTI,我认为 Hook 到事件 VM Object Allocation 和 Object Free 就足够了。遗憾的是,我读到第一个事件未触发是由于对 new
的调用.
我最后的想法是检查事件 MethodExit 是否名称为 <init>
从而将此调用声明为对象分配。但是,在此事件中我无法获取对象,因此无法调用 GetObjectSize
.
简单地遍历堆,不包含关于哪个对象被哪个线程分配的信息。有谁知道如何实现这个?
最佳答案
快速浏览一下 Hotspot VM (templateTable_x86_64.cpp) 的 _new 实现似乎表明,_new 没有为 JVMTI 提供任何 Hook (即使在看起来很慢的情况下也是如此)。因此,如果您的技巧不起作用,我看不到任何其他可能性 - 但我绝不是 JVMTI 专家。
我假设用一个小补丁编译您自己的 Hotspot VM 对您不是特别有用吗?
关于java - 使用 JVMTI 进行线程感知堆分配跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6365925/