使用 英特尔® VTune™ 探查器 分析使用 Oracle* 或 OpenJDK*(仅限 Linux*)执行的 Java* 应用程序。尽管 Java 代码执行是使用托管运行时环境处理的,但它在数据管理方面可能与使用本地语言编写的程序一样低效。例如,如果您关注数据挖掘 Java 应用程序的性能,则需要考虑目标平台内存架构、缓存层次结构和访问内存级别的延迟。从平台微体系结构的角度来看,Java 应用程序的分析类似于本机应用程序的分析,但有一个主要区别:要查看其程序源代码的性能指标,分析工具必须能够映射二进制代码的指标,或者编译或由 JVM 解释回 Java 或 C/C++ 中的原始源代码。VTune 探查器提供对 JIT 编译代码的低开销分析,可用于用户模式采样和跟踪以及基于硬件事件的采样分析类型。对解释的 Java 方法的分析是 有限的。使用以下命令启用 Java 代码分析 英特尔® VTune™ 探查器 并解释数据:

配置 Java 数据收集

要为 Java 代码配置性能分析,您可以使用 GUI 或命令行(虚拟机) 配置。您可以使用以下模式之一运行 Java 代码分析:在启动应用程序模式下配置 Java 分析:

  1. 嵌入您的 爪哇 批处理文件或可执行脚本中的命令。例如,创建一个 运行.bat Windows* 上的文件或 运行文件 使用以下命令在 Linux* 上创建文件:视窗:> java.exe -Xcomp -Djava.library.path=native_lib\ia32 -cp C:\Design\Java\mixed_stacks MixedStacksTest 3 2Linux:$ java -Xcomp -Djava.library.path=native_lib/ia32 -cp /home/Design/Java/mixed_stacks MixedStacksTest 3 2
  2. 创建一个 项目
  3. 在里面 配置分析 窗口 > 在哪里 窗格中,指定您的分析系统,例如, 本地主机.
  4. 在里面 什么 窗格,选择 申请启动 目标类型。
  5. 在里面 应用 字段,指定一个路径 跑步文件 。例如,在 Linux 上:
  6. 在里面 先进的 部分,选择 汽车 托管代码分析模式并启用 分析子进程 选项。

同样,您可以使用以下命令配置分析 VTune 探查器 命令行界面, 虚拟机. 例如,对于 Linux 上的热点分析,请运行以下命令行:

$ vtune -collect hotspots -- run.sh

或直接:

$ vtune -collect hotspots -- java -Xcomp -Djava.library.path=native_lib/ia32 -cp home/Design/Java/mixed_stacks MixedStacksTest 3 2

在附加到进程模式下配置 Java 分析:如果您的 Java 应用程序需要运行一段时间或在此分析开始时无法启动,您可以附上 VTune 探查器到独立的 Java 进程。在 Linux 上,您还可以附加 VTune 探查器到带有嵌入式 JVM 实例的 C/C++ 应用程序,用于基于硬件事件的采样分析类型。为此,请选择 附加到进程 目标类型在 什么 窗格并指定 爪哇 进程名称或PID。您可以使用命令行界面将分析附加到 Java 进程。例如,以下命令将热点分析附加到 Java 进程:

$ vtune -collect hotspots -target-process java

以下命令行示例通过其 PID 将热点分析附加到 Java 进程:

$ vtune -collect hotspots -target-pid 1234

 只有 Java 开发工具包 (JDK) 支持动态附加机制。要在低权限帐户(仅限 Linux*)下的附加到进程模式下配置 Java 分析:对于基于硬件事件的采样分析类型,您可以附加 VTune 探查器在超级用户帐户下运行到 Java 进程或带有嵌入式 JVM 实例的 C/C++ 应用程序,在低权限用户帐户下运行。例如,您可以附加 VTune 探查器 到基于 Java 的守护进程或服务。为此,请运行 VTune 探查器 在 root 帐户下,选择 附加到进程 目标类型并指定 爪哇 进程名称或PID。

识别最热门的方法

您可以运行 Hotspot 分析以获取最热门方法的列表以及它们的计时指标和调用堆栈。线程上的工作负载分布也显示在 时间线窗格。线程命名有助于确定执行资源消耗最多的代码的确切位置。例如,在 Linux* 上:

分析混合代码的堆栈

如果您在平台上追求最高性能,请考虑使用 C 甚至汇编等本机语言编写和编译 Java 项目的性能关键模块。这种编程方式有助于使用强大的 CPU 资源,如向量计算(通过 SIMD 单元和指令集实现)。在这种情况下,计算密集型函数成为分析结果中的热点,因为它们完成大部分工作,这是意料之中的。但是,您可能不仅对热点函数感兴趣,而且对识别 Java 代码中的位置感兴趣,这些函数是通过 JNI 接口调用的。在混合语言算法实现中跟踪此类跨运行时调用可能是一个挑战。为了分析混合代码分析结果, VTune 探查器正在将 Java 调用堆栈与 C/C++ 函数的后续本机调用堆栈“拼接”起来。反向调用堆栈拼接也有效。例如,在 Windows* 上:

原生功能混合本机/Java 调用堆栈
原生模块Java 调用堆栈中的已编译方法

由于 编译阶段的内联,有些函数可能默认不会出现在堆栈中。确保选择 显示内联函数 选项 内联模式 在过滤器栏上。

分析硬件指标

VTune 探查器还提供了一个高级分析选项,用于针对您平台中使用的 CPU 微体系结构优化 Java 应用程序。尽管 Java 和 JVM 技术旨在将开发人员从硬件架构特定的编码中解放出来,但是一旦 Java 代码针对当前的英特尔微架构进行了优化,它很可能会为未来几代 CPU 保留这种优势。您可以使用基于 硬件事件的采样数据收集来监控 CPU 管道中的硬件事件,并可以识别限制 CPU 中指令最有效执行的编码缺陷。的 CPU的度量 是可用的并且可显示对应用程序模块,功能,和Java代码的源极线。你也可以运行 当您需要找出系统中的驱动程序或中间件层中调用的函数的调用路径时,具有堆栈的基于硬件事件的采样集合

限制

VTune 探查器 支持对 Java 应用程序的分析,但有一些限制:

  • 托管代码不支持系统范围的分析。
  • JVM 会解释一些很少调用的方法,而不是为了性能而编译它们。 VTune 探查器 不识别解释的 Java 方法并将此类调用标记为 ! 口译员 在恢复的调用堆栈中。如果您希望这些函数与其名称一起显示在堆栈中,请使用以下命令强制 JVM 编译它们 -Xcomp 选项(显示为 [编译的Java代码]结果中的方法)。但是,如果在执行期间调用了许多小的或很少使用的函数,则时序特性可能会发生显着变化。
  • 打开热点的源代码时, VTune 探查器可能将事件或时间统计归因于不正确的代码段。它的发生是由于 JDK Java VM 的特殊性。对于循环,性能指标可能会向上滑动。通常,该信息属于热方法源代码的第一行。在下面的例子中,一条真正消耗 CPU 时间的热点线是第 35 行。
  • 将事件和时间映射到源代码行视为近似值。
  • 对于热点分析类型 用户模式采样 模式, VTune 探查器可能只显示调用堆栈的一部分。要在 Windows 上查看完整的堆栈,请使用 -Xcomp 附加命令行 JDK Java VM 选项,启用 JIT 编译以获得更好的堆栈遍历质量。要在 Linux 上查看完整的堆栈,请使用其他命令行 JDK Java VM 选项来更改 Java VM 的行为:
    • 使用 -Xcomp 附加命令行 JDK Java VM 选项,启用 JIT 编译以获得更好的堆栈遍历质量。
    • 在 Linux* x86 上,使用客户端 JDK Java VM 而不是服务器 Java VM:要么明确指定 -客户,或者干脆不指定 -服务器 JDK Java VM 命令行选项。
    • 在 Linux x64 上,指定 -XX:-UseLoopCounter 命令行选项,关闭解释方法与编译版本的即时替换。
  • 热点和微架构分析类型支持 Java 应用程序分析。对线程分析的支持是有限的,因为某些嵌入式 Java 同步原语(不调用操作系统同步对象)无法被线程识别 VTune 探查器. 因此,一些时序度量可能会失真。
  • 在 Java 源代码中没有提供用于集合控制的用户 API 的专用库。但是,您可能想尝试通过包装 __it 使用 JNI 调用调用。
最后修改日期: 2021年9月28日

留言

撰写回覆或留言