我希望对Java项目进行性能分析。为了获得结果,我想向JVM添加“挂钩”,以便每次发生堆访问时,都会调用“挂钩”并进行一些跟踪。我一直在研究JVMTI,但这似乎没有给我我期望的结果。
我有几个问题:
谢谢。
答案 0 :(得分:2)
我想向JVM添加一个“钩子”,以便每次发生堆访问时
您实际上无法在Java中执行此操作,因为钩子本身会访问堆并自行校准。即使您解决此问题,它也可能使程序运行缓慢。
您可以做的是使用调试接口在每条指令后设置断点,检查指令并查看其是否访问了堆。这可能比正常速度慢10,000倍。
另一种方法是使用Instrumentation
转换字节码以跟踪每个内存访问。这可能只会慢几百倍。
要有效地执行建议,可以使用https://software.intel.com/en-us/articles/intel-performance-counter-monitor,它在Linux上由perf
之类的工具使用。这需要您正在使用的处理器的深入了解