JVM:为堆访问添加一个钩子
JVM: Add a hook to Heap Access
我希望对我的 Java 项目进行概要分析。为了获得结果,我想将 "hook" 添加到 JVM,以便每次发生堆访问时,都会调用 "hook" 并进行一些跟踪。我一直在调查 JVMTI 但这似乎并没有给我预期的结果。
我有几个问题:
- 是否可以添加这样的钩子?
- 如果可能,我应该使用哪些正确的tools/interfaces?
- 如果没有现成的工具可以做到这一点,我可以通过修改 JVM 代码库来实现吗?
谢谢。
I want to add a "hook" to the JVM so that every time a heap access occurs
你不能在 Java 中真正做到这一点,因为挂钩本身会访问堆和调用本身。即使您解决了这个问题,它也会使程序慢得不可思议。
你可以做的是使用调试界面在每条指令后设置断点,检查指令是否访问了堆。这可能比正常情况慢 10,000 倍。
另一种方法是使用 Instrumentation
来翻译字节码以跟踪每个内存访问。这可能只会慢几百倍。
要有效地执行您的建议,您可以使用 https://software.intel.com/en-us/articles/intel-performance-counter-monitor,perf
等工具在 Linux 上使用了它。这需要深入了解您正在使用的处理器
我希望对我的 Java 项目进行概要分析。为了获得结果,我想将 "hook" 添加到 JVM,以便每次发生堆访问时,都会调用 "hook" 并进行一些跟踪。我一直在调查 JVMTI 但这似乎并没有给我预期的结果。
我有几个问题:
- 是否可以添加这样的钩子?
- 如果可能,我应该使用哪些正确的tools/interfaces?
- 如果没有现成的工具可以做到这一点,我可以通过修改 JVM 代码库来实现吗?
谢谢。
I want to add a "hook" to the JVM so that every time a heap access occurs
你不能在 Java 中真正做到这一点,因为挂钩本身会访问堆和调用本身。即使您解决了这个问题,它也会使程序慢得不可思议。
你可以做的是使用调试界面在每条指令后设置断点,检查指令是否访问了堆。这可能比正常情况慢 10,000 倍。
另一种方法是使用 Instrumentation
来翻译字节码以跟踪每个内存访问。这可能只会慢几百倍。
要有效地执行您的建议,您可以使用 https://software.intel.com/en-us/articles/intel-performance-counter-monitor,perf
等工具在 Linux 上使用了它。这需要深入了解您正在使用的处理器