使用 NetBeans Profiler 5.5
完整分析与抽样分析
在 CPU 性能分析期间,将在每个被分析的方法开始位置插入“方法进入”调用,并在每个 return 前插入“方法退出”调用。这些“方法进入”/“方法退出”调用会生成时间戳。完整分析和抽样分析的区别在于何时在分析的方法上生成时间戳:
- 完整分析模式
每个“方法进入”和“方法退出”调用都生成一个时间戳,并且将这些时间戳之间的差值作为在方法中花费的时间进行计算。
- 抽样分析模式
只会在每个指定的抽样时段快要结束时出现的那些“方法进入”/“方法退出”调用上生成时间戳。
完整分析
使用缺省完整分析时,插入的“方法进入”和“方法退出”调用都会记录每次调用它们的时间戳。如果两个时间戳之间存在差值,则计算目标应用程序的执行时间。通过这种方式,您可以获得精确的本地时间。
此模式的缺点是,返回高分辨率时间戳的操作系统调用的开销非常高:在运行 Solaris 和 Linux 操作系统的计算机上,开销几乎达到几百纳秒;而在运行 Windows 的计算机上,开销超过 1 微秒。因此,如果应用程序包含很多经常执行的小方法(几行代码),您会发现使用完整分析的开销很高:介于百分之几十和百分之几千之间,具体取决于应用程序。
抽样分析
抽样分析是一种混合方法,它同时具有传统分析(计算方法调用的确切数目)和传统抽样技术(开销较小)的优点。使用此方法时,“方法进入”和“方法退出”调用会计算调用次数,但不会在每次调用它们时都生成时间戳。它们而是会检查每个线程的标志,这些标志用于分隔线程的执行,由 Profiler 管理,并在指定的时间段设置。
如果线程的标志为 true,则下一次“方法进入”/“方法退出”调用(无论先调用哪一个)都将生成时间戳。然后,它将此时间戳和以相同方式记录的前一个时间戳的差值记录到当前位于线程栈顶部的方法中。通过这种方法,对操作系统高精度计时器的调用次数将大大减少。
对于每秒进行大约 10,000 到 1,000,000 次调用的调用高度密集型应用程序,这会大大减少开销(10 倍或更多)。此外,对于此类应用程序来说,这种性能分析方法实际上可能会提供更精确的结果。这是因为,它对 JVM 中的动态编译器和 CPU 可能在程序执行过程中应用的优化产生较小的干扰。
此方案的唯一缺点是,它对很少执行或执行时间较短的方法无法提供精确的结果。但是与传统抽样不同,它至少会记录这些方法调用的准确次数。
应该选择哪种模式呢?
在选择性能分析方法时,我们建议您先选择完整分析。如果注意到开销达到了 100% 或更多,并且调用密度大于 10,000/秒(通常两者会同时出现),请考虑切换到抽样分析。对于调用高度密集型应用程序来说,完整分析和抽样分析生成的结果可能会略有不同。在这种情况下,抽样分析通常为前 10 到 20 个方法生成更精确的结果;而完整分析为其余应用程序代码生成更精确的结果。
另请参见
