Sun Studio 12:性能分析器

基于 Java 技术的软件执行概述

对于典型的开发者,基于 Java 技术的应用程序就像任何其他程序那样运行。此类应用程序从主入口点(通常名为 class.main,可以调用其他方法)开始,就像 C 或 C++ 应用程序那样。

对于操作系统,使用 Java 编程语言(纯 Java 或与 C/C++ 混合)编写的应用程序作为实例化 JVM 软件的进程运行。JVM 软件是从 C++ 源代码编译的,从 _start(它会调用 main 等)开始执行。它从 .class 和/或 .jar 文件读取字节码,并执行在该程序中指定的操作。可以指定的操作包括动态装入本机共享对象以及调用该对象内包含的各种函数或方法。

JVM 软件可以执行许多用传统语言编写的应用程序通常不能执行的操作。启动时,该软件会在其数据空间中创建许多动态生成的代码的区域。其中一个区域是用于处理应用程序的字节码方法的实际解释器代码。

在执行基于 Java 技术的应用程序期间,JVM 软件解释大多数方法;这些方法称为已解释的方法。Java HotSpot 虚拟机会在解释字节码以检测频繁执行的方法时监视性能。然后,Java HotSpot 虚拟机可能编译重复执行的方法,以生成这些方法的机器码。生成的方法称为已编译的方法。之后,虚拟机执行更高效的已编译方法,而不是解释方法的原始字节码。已编译的方法会被装入应用程序的数据空间,并且可能会在之后的某个时间点卸载它们。此外,还会在数据空间中生成其他代码以执行已解释代码和已编译代码之间的转换。

用 Java 编程语言编写的代码还可以直接调用本机编译的代码(C、C++ 或 Fortran);此类调用的目标称为本机方法。

用 Java 编程语言编写的应用程序本身就是多线程的,对于用户程序中的每个线程,都具有一个 JVM 软件线程。Java 应用程序还具有若干个内务处理线程,用于信号处理、内存管理和 Java HotSpot 虚拟机编译。

在 J2SE 5.0 中的 JVMTI 上,可通过各种方法实现数据收集。

Java 调用栈和机器调用栈

性能工具通过记录每个 Solaris LWP 或 Linux 线程生存期中的事件,以及发生事件时的调用栈来收集其数据。在执行任何应用程序的任意点上,调用栈表示程序在其执行中所处的位置以及它如何到达该位置。混合模型 Java 应用程序区别于传统 C、C++ 和 Fortran 应用程序的一个重要方面是,在运行目标的过程中的任何瞬间都存在两个有意义的调用栈:Java 调用栈和机器调用栈。这两个调用栈都在配置期间进行记录,并在分析期间进行协调。

基于时钟的分析和硬件计数器溢出分析

用于 Java 程序的基于时钟的分析和硬件计数器溢出分析的工作方式与用于 C、C++ 和 Fortran 程序的情况基本相同,不同之处在于前者会同时收集 Java 调用栈和机器调用栈。

同步跟踪

Java 程序的同步跟踪基于线程尝试获取 Java 监视器时生成的事件。将会为这些事件同时收集机器调用栈和 Java 调用栈,但不为在 JVM 软件中使用的内部锁收集同步跟踪数据。

堆跟踪

堆跟踪数据记录由用户代码生成的对象分配事件以及由垃圾收集器生成的对象解除分配事件。此外,对 C/C++ 内存管理函数(如 mallocfree)的任何使用也将生成记录的事件。