JVM:将挂钩添加到堆访问

时间:2018-09-23 18:43:08

标签: java jvm jvmti openj9

我希望对Java项目进行性能分析。为了获得结果,我想向JVM添加“挂钩”,以便每次发生堆访问时,都会调用“挂钩”并进行一些跟踪。我一直在研究JVMTI,但这似乎没有给我我期望的结果。

我有几个问题:

  • 是否可以添加这样的钩子?
  • 如果可能,我应该使用哪些正确的工具/界面?
  • 如果没有现成的工具可以执行此操作,是否可以通过修改JVM代码库来实现?

谢谢。

1 个答案:

答案 0 :(得分:2)

  

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

您实际上无法在Java中执行此操作,因为钩子本身会访问堆并自行校准。即使您解决此问题,它也可能使程序运行缓慢。

您可以做的是使用调试接口在每条指令后设置断点,检查指令并查看其是否访问了堆。这可能比正常速度慢10,000倍。

另一种方法是使用Instrumentation转换字节码以跟踪每个内存访问。这可能只会慢几百倍。

要有效地执行建议,可以使用https://software.intel.com/en-us/articles/intel-performance-counter-monitor,它在Linux上由perf之类的工具使用。这需要您正在使用的处理器的深入了解