Oracle® Developer Studio 12.5:性能分析器教程

退出打印视图

更新时间: 2016 年 6 月
 
 

了解 JVM 行为

本节介绍如何通过使用过滤器、"Expert Mode"(专家模式)和 "Machine Mode"(计算机模式)检查 JVM 中出现的内容。

  1. 选择 "Functions"(函数)视图并查找名为 <JVM-System> 的例程。

    如果您键入 <JVM 并按 Enter 键,则可以使用工具栏中的 "Find"(查找)工具非常快速地查找该例程。

    在此实验中,<JVM-System> 花费了大约一秒的 "Total CPU Time"(CPU 总时间)。<JVM-System> 函数中的时间表示 JVM 的工作,而不是用户代码的工作。

  2. 右键单击 <JVM-System> 并选择 "Add Filter: Include only stacks containing the selected functions"(添加过滤器:仅包括含有所选函数的堆栈)。

    请注意,导航面板下面的过滤器面板以前显示 "No Active Filters"(没有活动过滤器),现在显示 "1 Active Filter"(1 个活动过滤器)以及您添加的过滤器的名称。"Functions"(函数)视图将刷新,从而仅剩余 <JVM-System>

  3. 在性能分析器工具栏中,将查看模式选择器从 "User Mode"(用户模式)更改为 "Expert Mode"(专家模式)。

    "Functions"(函数)视图将刷新以显示由 <JVM-System> 时间表示的许多函数。函数 <JVM-System> 自身不再可见。

  4. 通过单击 "Active Filters"(活动过滤器)面板中的 X 来删除过滤器。

    "Functions"(函数)视图将刷新以再次显示用户函数,但是在 <JVM-System> 函数不可见时,<JVM-System> 表示的函数也仍可见。

    image:“Functions“(函数)视图的 “Expert Mode“(专家模式)

    请注意,您不需要执行过滤来展开 <JVM-System>。该过程包括过滤以便更容易地显示 "User Mode"(用户模式)与 "Expert Mode"(专家模式)之间的差异。

    总结:"User Mode"(用户模式)显示所有用户函数,但是将 JVM 中花费的所有时间聚集到 <JVM-System> 中,而 "Expert Mode"(专家模式)展开该 <JVM-System> 聚集。

    接下来,您可以了解 "Machine Mode"(计算机模式)。

  5. 在查看模式列表中选择 "Machine Mode"(计算机模式)。

    image:“Functions“(函数)视图的 “Machine Mode“(计算机模式)

    在 "Machine Mode"(计算机模式)中,解释的任何用户方法不按名称显示在 "Functions"(函数)视图中。解释的方法中花费的时间将聚集到 Interpreter 条目中,其表示 JVM 中以解释方式执行 Java 字节代码的部分。

    但是,在 "Machine Mode"(计算机模式)下,"Functions"(函数)视图显示 HotSpot 编译的任何用户方法。如果选择 Routine.add_int() 等编译的方法,"Selection Details"(选择详细信息)窗口将该方法的 Java 源文件显示为 "Source File"(源文件),但是 "Object File"(对象文件)和 "Load Object"(装入对象)显示为 JAVA_COMPILED_METHODS

    image:“Functions“(函数)视图的 “Machine Mode“(计算机模式),包含 Hotspot 编译的方法的 “Selection Details“(选择详细信息)
  6. 仍在 "Machine Mode"(计算机模式)下时,如果在 "Functions"(函数)视图中选择了编译的方法则切换到 "Disassembly"(反汇编)视图。

    "Disassembly"(反汇编)视图显示 HotSpot 编译器生成的计算机代码。可以查看代码上面列标题中的 "Source File"(源文件)、"Object File"(对象文件)和 "Load Object"(装入对象)名称。

    image:“Machine Mode“(计算机模式)下的 Hot-spot 编译的方法

    大多数可见行上显示的 "Total CPU Time"(CPU 总时间)为零,因为该函数中的大多数工作将在代码中进一步执行。

继续下一节。