corner imagecorner image FeaturesPluginsDocs & SupportCommunityPartners


性能分析提示

以下是您在分析应用程序时应当注意的一些常规性能分析事项和提示:

  • Profiler 校准 - 结果准确性:对于每个用于性能分析的 JDK,Profiler 都需要执行一次初始校准。通过校准获取的数据将用于从收集的结果中排除额外产生的性能分析开销,以便能够提供更精确的执行时间信息。校准数据与系统性能(CPU 速度、内存和总线吞吐量等)和 JDK 版本密切相关。当每次更改 JDK 或者执行影响系统性能的更改时,都应该重新运行校准以确保 Profiler 收集的结果准确无误。
  • 运行时优化与分析:要获取方法调用树和计时,Profiler 必须执行分析;这就意味着,将对原始应用程序的字节代码进行略微的修改。如果是为了加快执行速度,JIT 编译器对原始代码进行了编译,则该代码在性能分析过后将转换为原来的解释执行,运行速度会在一段时间内显著降低。但这并不意味着 Profiler 产生了巨大的开销;如果对其正确设置,它将允许所分析的应用程序以接近全速的方式运行。理想状态下,应该在代码分析过后再对其运行若干次,这样 VM 就可以再次应用运行时优化 (Runtime Optimization, JIT) 了。这可确保收集到的性能分析结果代表了产品环境中的真实应用程序行为。
  • 运行时优化 - 跳过简单方法:应用程序中通常包含许多简单方法,在将它们编译为字节码或进行内联时,其执行过程不占用任何实际时间。分析此类方法可能会产生大量的性能分析开销,并且不会得到任何有用的结果。因此,在“分析性能 - 整个应用程序”性能分析中缺省禁用了 getter/setter 和空方法性能分析。也就是说,您不会在调用树或热点视图中看到这些方法。可以通过创建定制性能分析配置并显式地启用 getter/setter 和空方法性能分析来更改此行为。
  • 运行时优化 - 字节码例程:某些数学函数(如 Math.sin())是作为调用字节码的 Java 方法来实现的,但在收集的性能分析结果中却看不到它们。原因就在于在程序执行方面进行了某些优化,导致这些函数直接在字节码中执行,从而跳过了其作为 Java 方法的部分。在这种情况下,Profiler 无法检测到此类方法已在运行,并且也不会收集或显示相应的调用。在评估性能分析结果时,应该注意这种情况。如果运行的是基于 5.0 的 JVM,Profiler 检测不到的特定函数包括 Math.sin()、Math.cos() 和 Math.sqrt()。在基于 6.0 的 JVM 中,同时还检测不到 Math.tan()、Math.abs()、Math.log() 和 Math.log10() 函数。
  • 编译时优化与真实性能分析结果:在评估性能分析结果时,应考虑到 Java 编译器优化,典型事项为字符串连接或常量表达式求值。例如,使用 System.out.println("Value of a: " + a) 将会创建并处理 StringBuffer,并最终使用某些解析/转换函数将浮点/双精度变量 'a' 值输出为字符串。Profiler 无法检测到此类优化,而只报告应用程序代码的实际运行时流/行为。
  • 动态 CPU 频率切换:如果所分析的应用程序在使用动态 CPU 频率切换技术(如 SpeedStep 或 PowerNow!)的计算机上运行,则应确保禁用这些技术。为了尽可能地提供准确的性能分析结果,Profiler 使用静态校准数据来描述系统性能。如果在性能分析过程中更改 CPU 频率,将会大大影响分析结果的准确性。

 

 
 
loading
Please Confirm