- 适用于 JDK 24 的 GraalVM(最新)
- 适用于 JDK 25 的 GraalVM(早期访问)
- 适用于 JDK 21 的 GraalVM
- 适用于 JDK 17 的 GraalVM
- 存档
- 开发构建
使用 LCOV 理解 PGO 报告
在这里,您将学习如何借助基于 LCOV 的工具分析 PGO 配置文件。
配置文件引导优化 (PGO) 有助于您最大限度地提高本机应用程序的性能。作为 PGO 过程的一部分,您创建一个带插桩的二进制文件并在其上运行工作负载,以生成一个 PGO 配置文件,然后您可以将其反馈到构建过程中,以生成应用程序的优化二进制文件。通常,您无需了解此类 PGO 配置文件的内容。然而,在某些情况下,您可能希望了解作为配置文件一部分记录了哪些信息,尤其是在优化二进制文件的性能出现问题时。GraalVM Native Image 可以将分析信息导出到LCOV 格式的额外文件中。您可以在任何支持 LCOV 格式的 IDE 或工具中打开并可视化此类文件。这使您可以看到代码的哪些方法被调用以及被调用的频率。
Graal 编译器在优化*热方法*(即被多次调用的方法)上花费的时间比优化*冷方法*(即只被调用几次或根本没有被调用的方法)更多。因此,您可以使用额外的 LCOV 导出检查在带插桩的二进制文件上运行的工作负载中实际调用了哪些方法。这也意味着 PGO 配置文件包含这些方法的适当分析信息。此外,覆盖率可视化有助于您识别应用程序的热方法,同样是针对在带插桩的二进制文件上运行的工作负载。如果您想最大限度地提高性能,这些通常是您需要仔细研究的方法。相反,完全未覆盖的方法是清理的潜在候选项,这反过来又可以加快构建时间。
创建覆盖率报告 #
要创建覆盖率报告,您首先需要在构建带插桩的二进制文件时,在 --pgo-instrument
选项的同时传递 -H:+ProfilingLCOV
实验性选项。例如
native-image -cp . GameOfLife -o gameoflife-instrumented --pgo-instrument -H:+UnlockExperimentalVMOptions -H:+ProfilingLCOV -H:-UnlockExperimentalVMOptions
报告(以 .info
跟踪文件的形式)将在运行带插桩的应用程序后与配置文件一起生成。与分析类似,还可以通过 -XX:ProfilesLCOVTraceFile
选项自定义生成的 info 文件的目标位置。例如
./gameoflife-instrumented -XX:ProfilesLCOVTraceFile=gameoflife-coverage.info
生成的 LCOV 跟踪文件提供方法级别的覆盖率信息,即特定方法是否已执行(以及执行了多少次)或未执行。此信息可以使用 lcov
命令轻松汇总(参见LCOV 官方手册页)。例如
lcov --summary gameoflife-coverage.info
这会输出以下格式的简短摘要
Summary coverage rate:
lines......: 17.3% (24873 of 144172 lines)
functions..: 15.6% (2390 of 15285 functions)
branches...: no data found
此外,为了可视化数据,可以使用genhtml
工具从 LCOV 数据创建 HTML 报告,或使用任何第三方 LCOV 数据可视化工具(例如,LCOV 查看器项目)。
为了显示哪些方法已插桩(找到)和哪些方法已执行(命中),genhtml
还会利用源文件(如果不可用,也可以使用 --synthesize-missing
选项省略)。此外,当源文件位于特定目录中时,--source-directory
选项也很有用。例如
genhtml --source-directory *absolute-path-to-sources* gameoflife-coverage.info
下面显示了由前一个命令生成的 gameoflife-coverage.info
跟踪文件的报告中的源文件视图示例
此外,functions
视图列出了特定源文件中找到的所有方法及其执行计数