Sun Studio 12:性能分析器

动态编译的函数

动态编译的函数是指程序执行时编译和链接的函数。收集器中并没有有关采用 C 或 C++ 编写的动态编译函数的信息,除非用户使用收集器 API 函数 collector_func_load() 提供所需的信息。“函数”标签、“源”标签和“反汇编”标签中显示的信息取决于传递给 collector_func_load() 的信息,如下所示:

有关收集器 API 函数的更多信息,请参见动态函数和模块

对于 Java 程序,大部分方法由 JVM 软件解释。在解释执行期间,在单独的线程上运行的 Java HotSpot 虚拟机会监视性能。在监视过程中,虚拟机可以决定使用已解释的一个或多个方法,生成相应的机器码,并执行更有效的机器码版本,而不是解释原始代码。

对于 Java 程序,无需使用收集器 API 函数;分析器通过在该方法的索引行下方使用一个特殊行,表明在带注释的反汇编代码列表中存在 Java HotSpot 编译的代码,如以下示例所示。


                     11.    public int add_int () {
                     12.       int       x = 0;
                         <Function: Routine.add_int()>
2.832     2.832          Routine.add_int() <HotSpot-compiled leaf instructions>
0.        0.             [ 12] 00000000: iconst_0
0.        0.             [ 12] 00000001: istore_1

反汇编代码列表仅显示已解释的字节代码,而不显示编译的指令。缺省情况下,在该特殊行的旁边显示已编译代码的度量。该独占和包含 CPU 时间与各行已解释字节代码的所有独占和包含 CPU 时间总和不同。通常,如果多次调用该方法,已编译指令的 CPU 时间将大于已解释字节代码的 CPU 时间总和,原因是已解释代码只是在最初调用该方法时执行一次,而已编译代码则在其后执行。

带注释的源代码不显示 Java HotSpot 编译的函数,而是显示一个特殊索引行,以指示不带行号的指令。例如,下面显示了与上例显示的反汇编提取对应的带注释的源代码:


                     11.    public int add_int () {
2.832     2.832        <Function: Routine.add_int(), instructions without line numbers>
0.        0.         12.       int       x = 0;
                       <Function: Routine.add_int()>