是否有可能在JVM(假设是VisualVM)上附加一个分析器会使一些方法运行得更慢,而不影响其他方法,从而导致结果出现偏差,使某段代码看起来像是热点,而实际上不是?我将专门问一个关于反射调用的例子。我正在运行的一些代码显示在Spring AOP调用上花费了大量时间(特别是invokeJoinpointUsingReflection)——作者说它在测试中运行良好(使用代码内微基准测试),但是当他们对其进行分析时,它显示这种方法比其他非反射方法花费的时间更长。所以这让我想知道分析器是否真的具有这种效果,并引导开发者走上错误的道路。请随意回答任何例子,反射部分只是我的例子。
分析器经常给出误导性的信息,但通常他们通常是正确的。他们倾向于在非常简单的方法中扭曲结果,如果没有启用分析,这些方法可能会进一步优化。
如果有疑问,我建议您使用另一个分析器,如YourKit(评估版本应该是好的),它有更轻的记录,但可以有相同的问题。
海森堡有一个著名的观察:从一个系统收集信息总是会干扰它,所以你不可能得到一个不受干扰的观察结果。(因此有了软件术语"海森堡bug")。是的,收集分析信息可能会导致实际性能的改变,从而误导您。
对于您的特定JVM或分析器来说,这是否以一种重要的方式是正确的,以及发生了多少干扰,这是工程问题。
大多数分析器都是基于样本的,因此您收集的数据越多,结果就越准确。据我所知,对于纯用Java编写的方法没有偏见。
某些分析器需要校准步骤,例如NetBeans和VisualVM。您可以验证所选分析器的年份和设置。