本教程说明 Oracle Solaris Studio 性能分析器的 Java 分析功能。它介绍了如何使用样例代码在性能分析器中执行以下操作:
检查各种数据视图中的性能数据,包括 "Overview"(概述)页面以及 "Threads"(线程)、"Functions"(函数)和 "Timeline"(时间线)视图。
查看 Java 代码和 C++ 代码的 "Source"(源)和 "Disassembly"(反汇编)。
了解 "User Mode"(用户模式)、"Expert Mode"(专家模式)和 "Machine Mode"(计算机模式)之间的差异。
深入了解执行程序的 JVM 的行为并查看任何 HotSpot 编译的方法的已生成本机代码。
了解如何通过用户代码调用垃圾收集器以及如何触发 HotSpot 编译器。
jsynprog 是 Java 程序,具有 Java 程序的许多典型子任务。该程序还装入 C++ 共享对象并从该对象调用各种例程,以显示从 Java 代码到动态装入的 C++ 库中的本机代码的无缝转换以及反向转换。
jsynprog.main 是主方法,调用不同类中的函数。它通过 Java 本地接口 (Java Native Interface, JNI) 调用来使用 gethrtime 和 gethrvtime 以对其自己的行为计时,并写入具有其自己的计时的记帐文件以及将消息写入 stdout。
jsynprog.main 具有许多方法:
Routine.memalloc 执行内存分配并触发垃圾收集
Routine.add_int 执行整型加法
Routine.add_double 执行双精度(浮点)加法
Sub_Routine.add_int 是派生调用,覆盖 Routine.add_int
Routine.has_inner_class 定义内部类并使用该类
Routine.recurse 显示直接递归
Routine.recursedeep 执行深度递归,显示工具如何处理截断的堆栈
Routine.bounce 显示间接递归,其中 bounce 调用 bounce_b,后者又会再回调 bounce
Routine.array_op 执行数组运算
Routine.vector_op 执行向量运算
Routine.sys_op 使用系统类中的方法
jsynprog.jni_JavaJavaC:Java 方法调用其他 Java 方法,而后者调用 C 函数
jsynprog.JavaCJava:Java 方法调用 C 函数,而该函数又会调用某个 Java 方法
jsynprog.JavaCC:Java 调用 C 函数,而该函数会调用另一个 C 函数
这些方法中的一些方法从另一些方法进行调用,所以它们并不是全部表示顶级任务。
在记录的实验中看到的数据将与此处显示的数据不同。用于教程中屏幕抓图的实验是在运行 Oracle Solaris 11.2 的 SPARC T5 系统上记录的。来自运行 Oracle Solaris 或 Linux 的 x86 系统的数据将会有所不同。此外,数据收集本质上是统计性的,随实验的不同而不同,即使运行在同一系统和 OS 上也是如此。
您看到的性能分析器窗口配置可能不会与屏幕抓图完全匹配。通过性能分析器,可以拖动窗口各部分之间的分隔条,折叠各部分以及调整窗口大小。性能分析器记录其配置,并在下次运行时使用相同的配置。在捕获教程所示的屏幕抓图的过程中进行了许多配置更改。