Java JVM:为堆访问添加一个钩子

Java JVM:为堆访问添加一个钩子,java,jvm,jvmti,openj9,Java,Jvm,Jvmti,Openj9,我希望对我的Java项目做一个概要分析。为了得到结果,我想向JVM添加一个“钩子”,以便每次发生堆访问时,都会调用“钩子”并进行一些跟踪。我一直在调查,但这似乎并没有给我我所期望的 我有几个问题: 有可能加上这样一个钩子吗 如果可能,我应该使用哪些正确的工具/接口 如果没有现成的工具可以做到这一点,我可以通过修改JVM代码库来实现吗 谢谢 我想向JVM添加一个“钩子”,以便每次发生堆访问时 在Java中不能真正做到这一点,因为钩子本身将访问堆和cal本身。即使你解决了这个问题,它也会让程序慢

我希望对我的Java项目做一个概要分析。为了得到结果,我想向JVM添加一个“钩子”,以便每次发生堆访问时,都会调用“钩子”并进行一些跟踪。我一直在调查,但这似乎并没有给我我所期望的

我有几个问题:

  • 有可能加上这样一个钩子吗
  • 如果可能,我应该使用哪些正确的工具/接口
  • 如果没有现成的工具可以做到这一点,我可以通过修改JVM代码库来实现吗
谢谢

我想向JVM添加一个“钩子”,以便每次发生堆访问时

在Java中不能真正做到这一点,因为钩子本身将访问堆和cal本身。即使你解决了这个问题,它也会让程序慢得不可思议

您可以使用调试接口在每条指令之后设置断点,检查指令并查看它是否访问了堆。这可能比正常情况慢10000x

另一种方法是使用
指令插入
来翻译字节码,以跟踪每个内存访问。这可能只慢几百倍

为了有效地执行您的建议,您可以使用Linux上的
perf
等工具所使用的工具。这需要深入了解您正在使用的处理器

我想向JVM添加一个“钩子”,以便每次发生堆访问时

在Java中不能真正做到这一点,因为钩子本身将访问堆和cal本身。即使你解决了这个问题,它也会让程序慢得不可思议

您可以使用调试接口在每条指令之后设置断点,检查指令并查看它是否访问了堆。这可能比正常情况慢10000x

另一种方法是使用
指令插入
来翻译字节码,以跟踪每个内存访问。这可能只慢几百倍


为了有效地执行您的建议,您可以使用Linux上的
perf
等工具所使用的工具。这需要对正在使用的处理器有深入的了解

能否更具体地介绍“堆访问”?JVMTI支持字段的观察点,但你不能真的想拦截对每个字段的每次访问?@Holger,但这正是我希望做的,因为我不能偏向某些对象和/或某些字段。你能更具体地说明“堆访问”吗?JVMTI支持字段的观察点,但你不能真的想拦截每个字段的每个访问?@Holger,但这正是我希望做的,因为我不能偏向某些对象和/或某些字段。