W. Binder
,
J.Hulaas/Electronic Notes in Theoretical Computer Science 164
(
2006
)
45
与CCT相比,MCT的深度是无限的。关于方法调用上下文和方法调用计数的细节
在第3节中解释。
大多数现有的分析器以秒为单位测量程序的CPU消耗。虽然CPU秒是最常见的性
能分析指标,但它有几个缺点:它依赖于平台(对于相同的程序和输入,CPU时间
差异取决于硬件、操作系统和JVM),准确地测量它可能需要依赖于平台的功能
(例如特殊的操作系统功能),并且结果可能不容易重现(CPU时间可能取决于
系统负载等因素)。此外,测量扰动可能是一个严重的问题:当程序在不进行分析
的情况下执行时,分析程序的测量CPU消耗可能与有效CPU消耗显著不同。最后一
点在JVM上尤其如此,因为JVMPI的使用禁用了即时编译。
我们遵循不同的方法,使用字节码计数作为动态度量[6]。也就是说,对于每个
方法调用上下文,我们计算未修改的程序将执行的字节码的数量。这些值是平台无
关的,它们可以直接从程序字节码中计算,而无需求助于平台特定的函数,它们是
可再现的(对于确定性程序),并且它们表示原始程序的执行(没有测量扰动)。
在以前的工作中,我们已经建立了字节码计数作为资源核算的平台无关度量(例
如,服务器环境的生产时间监视)和控制(例如,防止移动代码系统中的拒绝服务
攻击)[10,19,9]。 在这里,该指标是高效配置文件的关键。 关于字节码计数的
细节在第4节中介绍。
JP
是一个灵活的,可扩展的Java框架。它提供了一个API,允许用户定义一个定
期激活的自定义配置文件代理。剖析代理可以聚合由若干线程计算的剖析信息。它
可以在程序被分析时显示最新的分析信息(连续度量[14]),它可以通过网络发送
所获得的信息, 或者在程序终止之前将其写入文件。第5节详细讨论了调剖剂和
相应API的定期激活。
3
方法调用上下文和调用计数
3.1
运行时类
在执行转换后的字节码时,每个线程创建一个MCT。树节点是图1所示的
IC
(调用
上下文)类型。每个调用上下文都存储了同一个调用堆栈中某个方法的所有调用的
分析信息(方法调用计数器
invoc
和字节码计数器
instr
)。
4
每个调用上下文都有
一个被调用方方法的映射。 被调用方方法的标识符(类型MID,见下文)作为映射
中的键。 这些值是被调用者的调用上下文。 在图1中,标准的HashMap类是
4
出于性能原因,
invoc
和
instr
计数器是32位值,它们被视为无符号的(参见
getInclusive
()和
getInstr
()),以便允许一个超过一 个 (详细信息将在第5节中解释)。