使用基于堆栈跟踪高速缓存器的动态剖析的内嵌的制作方法

文档序号:7444580阅读:140来源:国知局

专利名称::使用基于堆栈跟踪高速缓存器的动态剖析的内嵌的制作方法
技术领域
:本发明涉及软件应用,具体地说涉及使用基于堆栈跟踪高速缓存器的动态剖析(dyanmicprofiling)改进内嵌。
背景技术
:许多现代的软件语言(比如Java、C#和C++)使用过程和函数(也称为方法)以作为语义提取边界,因此可以将程序划分为容易维护和开发的不同的单元。面向对象语言(比如Java、C#和C++)提供了这样的编程方法其中过程调用比较频繁并且过程大小较小。该方法可以是一个函数性的封装,并且它可以以新的实施方式替代,但致使调用点大规模增多并导致性能受损。换句话说,写模块化的程序导致性能受损,减小性能受损的一种方式是过程集成,也称为内嵌(inlining)。内嵌是这样的十分公知的编译时间优化技术以调用的过程本体替换或复制过程调用来改善程序的执行性能。人们作了许多尝试改善内嵌,尤其是对适时式(Just-In-Time(JIT))编译器的改善,以便获得更多的在运行时间上的好处。例如,在JIT编译的(JITted)代码性能方面内嵌具有重要的作用,这种代码性能在关于桌面和服务器/企业工作负荷的总体性能方面得到广泛使用。JITted代码是指通过JIT编译器在运行中产生的代码。虽然内嵌是改善静态编译软件应用系统的执行性能的十分公知的技术,但是如今可用的方法和系统不能有效地减小运行时间开销,或者不能通过使用堆栈跟踪高速缓存器使展开开销最小,或者不能改善处理器性能,尤其是使用JITted代码时的性能。如今一种可用的方法是仪器剖析(instrumentprofiling),即在该方法的入口加入仪器化代码(比如某一剖析代码)以采集调用点信息比如计数和调用者-被调用者关系。然而,通过仪器剖析,污染了原码并使性能降低,因为额外/外部代码被加入到了原码中。此外,通常仅与基线编译器一起使用仪器剖析。如今改善内嵌的另一可用的方法是采样剖析。采样剖析一般使用某些种类的仪表或其它的硬件辅助的监测方法以采样指令指针并将指令指针插入到数据库以查找哪个指针属于该对应的方法以确定哪种方法是热门的。一种方法是否热门取决于调用者调用它的被调用者的频率,将具有足够高的频率的方法分类为热门。然而,采样剖析仅限于确定热门方法,但在可能存在多个调用热门方法的调用者时不能找到特定的热门调用者-被调用者对。如今可用的方法、系统和技术在它们不能确定热门的调用者-被调用者关系时不令人满意并且不能提供精确且有效的内嵌。此外,如今可用的方法、系统和技术不能有效地减小运行时间开销、不能使堆栈展开开销最小或不能改善处理器性能。附图概述附加的权利要求详细地阐述了本发明的特征。结合附图从下文的详细描述中可以最佳地理解本发明的实施例及其优点,在附图中附图1所示为可以实施本发明的一种实施例的典型计算机系统的方块图;附图2所示为根据一种实施例原理性地示出动态剖析的流程图;附图3所示为根据一种实施例原理性地示出工作再编译调度程序的流程图;附图4所示为根据一种实施例原理性地示出堆栈跟踪的方块图;和附图5所示为根据一种实施例原理性地示出堆栈跟踪和最佳的展开过程的方块图。详细描述所描述的方法、系统和设备是用于以基于堆栈跟踪高速缓存器的动态剖析改善内嵌。广义上讲,本发明的实施例提供了内嵌提示和增强剖析性能。提供一种系统、设备和方法以周期性地监测和跟踪采样剖析和堆栈展开的指令指针以确定热门的调用者-被调用者关系和对应的调用者/被调用者对。根据一种实施例,堆栈展开(也称为堆栈爬行或堆栈行走)可以指从堆栈跟踪的一结构到另一结构(例如从顶部到底部)迭代的过程。堆栈展开可以称为获得堆栈跟踪信息的过程。堆栈跟踪信息可以包括堆栈结构(sstackframe)、与每个堆栈结构相关的前后关系信息、当前的指令指针、源行号信息和堆栈指针的列表。堆栈跟踪可以指堆栈指针的链,每个堆栈指针表示对某一函数的调用的状态。例如在从底部到顶部的堆栈跟踪中的结构可以表示调用者至被调用者的关系。根据一种实施例,由于在堆栈跟踪中几个结构可以仍然保持不变,因此可以提供减小的展开以免在填充堆栈跟踪时执行完整的堆栈展开,由此导致了轻量的内嵌。根据一种实施例,可以提供一种关系映射以将表示调用者/被调用者的键码与指示调用点执行频率(即多长时间执行调用一次)的对应值映射起来。可以提供该关系映射以进一步记录热门调用者-被调用者关系。根据一种实施例,提供方法查询表以保存每个方法的开始和结束地址,并追索和跟踪对应于热门的调用者-被调用者关系的调用者-被调用者对。根据一种实施例,提供一种用于轻量的剖析器(profiler)的系统、设备和方法,其使用堆栈跟踪高速缓存器以使展开成本最小。根据一种实施例,采集第一手信息并在中央处理单元(CPU)的空闲周期中分批地分析,使它可用于使编译器最优化。根据一种实施例,可以提供再编译调度程序以周期性跟踪关系映射以确定热门调用者-被调用者对并再编译调用者和内嵌的被调用者(如果需要的话)。再编译调度程序可用于基于预定的策略或标准开始和结束动态剖析。根据一种实施例,动态剖析可以基于堆栈跟踪高速缓存器以改善内嵌,由此改善软件应用的性能、软件应用的实施和程序设计系统研究。根据一种实施例,例如,不展开在堆栈跟踪高速缓存器中的所有的结构,可以使堆栈展开的运行时间开销最小。基于堆栈跟踪高速缓存器的动态剖析有助于减小运行时间开销和帮助改善机器和/或处理器性能。基于在此所提供的公开内容,在此将提及或讨论许多其它的实施例或者本领域的普通技术人员会清楚它们。在下文的描述中,为解释的目的,阐述许多特定的细节以提供对本发明的完整的理解。然而,对于本领域的普通技术人员来说,很显然在没有这些特定的细节的情况也可以实施本发明的这些实施例。在其它的实例中,以方块图的形式示出了十分公知的结构和装置。本发明的实施例包括不同的步骤,下文描述这些步骤。这些步骤可以通过硬件部件执行或者可以通过机器可执行的指令实施,这些指令可用于使以指令编程的通用或专用处理器或逻辑电路执行这些步骤。可替换的是,通过硬件或软件的组合也可以执行这些步骤。本发明的实施例可以作为可包括机器可读介质的计算机程序产品提供,在该介质上存储了用于将计算机(或其它的电子装置)编程为执行根据本发明的处理的指令。计算机可读介质包括(但不限于)软盘、光盘、只读光盘存储器(CD-ROM)和磁光盘、ROM、随机存取存储器(RAM)、可擦可编程只读存储器(EPROM)、电子可擦可编程序只读存贮器(EEPROM)、磁卡或光卡、高速存储器或适合于存储电子指令的其它类型的介质/机器可读介质。此外,本发明也可作为计算机程序产品下载,在该程序产品中通过通信链接(例如,调制解调器或网络连接)以嵌入在载波或其它的传播介质中的数据信号的方式可以将程序从远程计算机(例如服务器)传输给请求的计算机(例如客户)。因此,对于本说明书来说,载波或其它的传播介质应该被看作包括机器可读介质。附图1所示为可以实施本发明的一种实施例的典型的计算机系统的方块图。计算机系统100包括传输信息的总线或其它的通信装置101和与总线101耦合以处理信息的处理装置比如处理器102。计算机系统100进一步包括耦合到总线101以存储处理器102所执行的信息和指令的随机存取存储器(RAM)或其它的动态存储装置104(称为主存储器)。主存储器104也可用于在处理器102执行指令的过程中存储临时变量或其它的中间信息。计算机系统100也包括耦合到总线101以存储用于处理器102的静态信息和指令的只读存储器(ROM)和/或其它的静态存储装置106。数据存储装置107(比如磁盘或光盘)和它的相应的驱动器也可耦合到计算机系统100以存储信息和指令。计算机系统100也可通过总线101耦合到显示装置121(比如阴极射线管(CRT)或液晶显示器(LCD))以向终端用户显示信息。通常,包括字母和其它的键的字母数字输入装置122也可以耦合到总线101以将信息和/或指令选择传输给处理器102。其它类型的用户输入装置有光标控制器123(比如鼠标、跟踪球或光标方向键)以将方向信息和指令选择传递给处理器102并在显示器121上控制光标运动。通信装置125也可耦合到总线101。通信装置125可以包括调制解调器、网络接口卡或其它十分公知的接口器件,比如那些用于耦合到以太网(Ethernet)、令牌网或其它类型的物理连接以用于提供通信链接以支持例如局域网或广域网的接口器件。这样,计算机系统100可以通过常规的网络设施耦合到多个客户和/或服务器,比如公司的内部互联网和/或因特网。可以理解的是,对于某些实施,比上文所描述的实例更少或更多的装备的计算机系统可能比较理想。因此,对于不同的实施,计算机系统100的配置可能根据多种因素(比如价格限制、性能要求、技术革新和/或其它的情况)的不同而不同。应该注意的是,虽然在此所描述的步骤可以在经编程的处理器(比如处理器102)的控制下执行,但是在变型实施例中这些步骤可以全部或部分地通过任何可编程或硬编码的逻辑电路实施,例如通过现场可编程门阵列(FPGA)、晶体管-晶体管逻辑电路(TTL)或专用集成电路(ASIC)实施。此外,本发明的方法还可以通过经编程的通用计算机部件和/或定制的硬件部件的任何组合执行。因此,在此所公开的任何内容都不应该认为将本发明限制于特定的实施例,通过硬件部件的特定组合执行在这些特定的实施例中所描述的步骤。附图2所示为根据一种实施例原理性地说明动态剖析的流程图。根据一种实施例,对于每次新的调用,可以产生或构造堆栈结构以保存特定的调用的所需信息。根据一种实施例,编译器(比如适时式(JIT)编译器)可用于将堆栈结构标记为“没有被缓存(notcached)””或“处于缓存(incache)”。其它的编译器实例包括Java虚拟机、Java编译器、Java芯片等。根据各种因素和需求可以使用上述的任何编译器或其它的编译器。一旦产生了堆栈结构,编译器就将它标记为“没有被缓存”。根据一种实施例,通过该程序的继续,堆栈结构的堆栈可以与一系列有效结构一起保持增长。在某一点上,可以启动采样处理机并且可以调用那些“没有被缓存”结构的展开迭代。首先,在处理方块205中开始堆栈结构展开。堆栈结构跟踪可以以缺省值开始。在方块210中使用采样的指令指针到达第一/顶部堆栈结构。在判定方块215中,确定当前的结构是否是堆栈结构的底部,例如到达堆栈结构的最后结构。如果已经到达堆栈结构的最后结构,则在处理方块225中退出展开。如果还没有到达堆栈结构的最后结构,则在处理方块220中检验当前的结构以进一步确定它是否是“处于缓存”。根据一种实施例,如果确定该结构是“处于缓存”,则在处理方块225中退出展开。“处于缓存”结构意味着所有的堆栈结构要来的或者前面的结构都在高速缓存器中。换句话说,自从最后的采样起该结构还没有被弹出过,并退出展开。术语“没有被缓存”和“处于缓存”可以分别是“有效的”和“无效的”同义语。根据一种实施例,结构可以是Java结构或Microsoft.Net结构等类似的结构。根据一种实施例,如果确定结构为“没有被缓存”,则在处理方块230中记录调用者-被调用者关系。根据一种实施例,根据作为当前的结构指令指针(frame_ip)的当前的调用点指令指针(callsite_ip)可以记录调用者-被调用者关系。根据一种实施例,调用者-被调用者关系的记录可以与关系映射中更新项目一样简单。在处理方块235中,将该结构标记为“处于缓存”,表示该结构已经展开了。在处理方块240中,结构的展开继续到下一结构,在判定方块215中,确定是否已经到达该堆栈的最后结构。根据一种实施例,展开的迭代计数取决于采样频率,比如如果采样间隔更长则可以存在更多的“没有被缓存”结构。此外,根据一种实施例,采样可以是轻量的,这部分可能是相关于或因为记录关系的快速实施。根据一种实施例,该关系映射可以是将调用点映射到计数的散列表(调用点->计数)。换句话说,调用点可以是表示调用者/被调用者关系的键标(key),该计数表示指示已经执行的调用点的次数,即特定调用者调用它的被调用者的频率。根据一种实施例,如果该计数较大,则它表示调用者-被调用者关系热门。计数大小和该关系的热度可以彼此成正比,计数越大,则调用者-被调用者关系可能越热门。此外,该关系映射可以作为散列表,这种散列表不仅有利于快速地存取,而且还定义了如何根据取决于散列表实施的散列算法的键标(调用点)存取值(计数)。符号“map[key]”表示对映射到键标的值的存取。根据一种实施例,调用点指令指针(callsite_ip)可以足够保留关于调用者和被调用者的信息。对于每种方法,编译器可以具有并维护调用点信息(例如,callsite_ip,callee)的列表,这意味着在callsite_ip上调用被调用者。此外,每个调用点可以映射到调用点指令指针。根据一种实施例,调用点意味着在这个点上调用者正在及时地调用被调用者。换句话说,使用调用点指令指针可以跟踪或找到调用者,根据一种实施例,例如使用方法查询表(调用者=method_lookup_table.find(callsite_ip));被调用者=caller.get_callee(callsite_ip))。根据一种实施例,调用点指令指针可以表示代码地址,并且该方法可以包含特定的代码地址。例如,该方法是调用者,并且使用方法查询表可以找到它。此外,调用者可以保留调用点信息的列表,以使调用者使用调用点指令指针可以找到被调用者,同样地,构造调用者-被调用者关系。根据一种实施例,方法查询表可以是一种在编译器产生它的代码之后保存每种方法的开始和结束地址的数据结构。换句话说,对于每种方法,在具有这些方法中每种方法的开始和结束地址的方法查询表中可以存在入口。给定代码地址,使用方法查询表该运行时间可以找到包含该特定的地址的方法。根据一种实施例,方法查询表在使用返回地址找到调用者来执行指令指针采样和堆栈展开的过程中比较有用。方法查询表数据结构可以是使查询更加容易的容器。例如,数据结构可以与带有元组的元素类型的线性分类阵列(start_address,end_address)一样简单,使用十分公知的对分检索方法查询表在它们中进行查询。根据一种实施例,与记录和指令指针一起可以执行堆栈展开以记录调用者-被调用者关系。根据一种实施例,额外或外部代码可以不加入到原码中。这种优点提供了执行内嵌的满意的方法,因为它不会污染原码或不将仪器化时间加入到导致程序动作改变的运行代码中。根据一种实施例,使用通过非破坏性展开周期性地跟踪应用线程的指令指针的采样剖析确定调用者-被调用者关系。根据一种实施例,使用硬件执行计数器、用户级定时器等可以执行采样。使用各种系数比如较低的性能、采样精度等或其组合可以预先定义采样的频率。此外,根据一种实施例,剖析器可以使用堆栈跟踪高速缓存器来减小展开成本,使剖析器相对较轻量。根据一种实施例,通过采集第一手信息和在中央处理单元(CPU)空闲周期中成批地执行分析可以减小展开成本。基于预定的策略或标准可以开始或结束动态剖析。这种轻量的剖析可以使该剖析适合于优化编译器。根据一种实施例,剖析器可以基于或用于采样剖析,但也可以基于或用于仪器化剖析(instrumentationprofiling)。根据一种实施例,采样可以包括周期性监测运行应用线程的指令指针。基于在性能受损和采样精度之间的折衷可以控制这种频率。换句话说,剖析可以继续的多大的频率或多长的时间取决于采样的性能和/精度。根据一种实施例,可以使用硬件执行计数器比如Vtune、系统定时器中断、用户级定时器等可以启动采样剖析。根据一种实施例,在异常、无用信息采集(GC)计数和对堆栈的可靠性校验的过程中可以执行用于记录调用者-被调用者关系的堆栈展开。然而,根据一种实施例,展开可以是轻量的,这是指仅需要找到“没有被缓存”的堆栈结构,即仅仅那些感兴趣的并来回弹出和压入的堆栈结构。此外,根据一种实施例,仅认为那些与“没有被缓存”的堆栈结构对应的方法是热门的,处于堆栈结构的底部的方法(例如,main())可以不进行再编译。根据一种实施例,由于几个堆栈结构保持不变,因此通过不要求全部堆栈展开,堆栈展开可能仅需要部分展开,这就使得需要相对较轻量的展开。根据一种实施例,通过某些简明的提示在高级语言(如C++)层面上可以进行内嵌,并且通过编译器也可以执行。根据一种实施例,编译器可以具有在内嵌策略中定义的它的内嵌试探法,并且静态编译器也可以使用静态剖析信息以执行更积极的且更加精确的内嵌。关于JIT编译器,可以不使用用于内嵌方法的积极的策略,并且内嵌试探法大部分是静态的且简单的。例如,仅给这些方法内嵌小于某些阈值的代码大小以及适时式(justintime)特性,JIT编译器可以不进行静态剖析以指令进行内嵌。根据一种实施例,内嵌可以用于桌面和服务器/企业工作负荷的总指标的JIT编译的(JITed)代码指标。附图3所示为根据一种实施例原理性地说明工作再编译调度程序的流程图。根据一种实施例,在处理方块305中在空闲优先级运行的再编译调度程序周期性地检验关系映射以便监测调用者-被调用者对或关系以寻找热门的调用者-被调用者对或关系。与计数成正比例的热门的调用者-被调用者对或关系可以指示更大的计数。在判定方块310中,再编译调度程序确定调用者-被调用者对是否是热门的,即计数是否足够大到可认为调用者-被调用者对是热门的。根据一种实施例,计数是否是足够大(即调用者-被调用者对是否是足够热门)取决于与各种因素(比如策略或标准)相关的一个热度阈值或多个热度阈值。热门的调用者-被调用者对可以是对应于所记录的调用者-被调用者关系的调用者-被调用者对,或者换句话说,认为对应于记录的调用者-被调用者关系的调用者-被调用者对是热门的。如果确定调用者-被调用者对是热门的,并且如果值得编译的话,则在处理方块315中可以编译热门的调用者-被调用者对的调用者。在处理方块320中,可以内嵌热门的调用者-被调用者对的被调用者(即对应于编译的调用者的被调用者)。根据一种实施例,通过搜索方法查询表,再编译调度程序可以从指令指针中推定方法处理,这个方法查询表可以存储每个方法处理的开始和结束指令指针。如果确定调用者-被调用者对不热门,则在处理方块305中再编译调度程序可以继续监测调用者-被调用者对。根据一种实施例,如果再编译调度程序发现了可以连接的几个调用者-被调用者对并且它们具有类似的采样计数即它们具有类似的热度,则它可以执行更加积极的内嵌提示。例如,A调用B,B调用C,并且找到了超过一定量的热度阈值的两对调用者-被调用者,在这种情况下,再编译调度程序可以发布具有在A中内嵌B和C的提示的再编译请求,即重新编译A以内嵌B和C。此外,根据一种实施例,再编译调度程序基于某些预定的策略、标准等或其组合自动开始和结束动态剖析。这些策略或标准的某些实例可以是关于动态剖析花费的时间长短、采集的采样的数量、发布的再编译请求的数量等或其组合。附图4所示为根据一种实施例原理性地示出的堆栈跟踪的方块图。堆栈402结构404-416的堆栈。如图所示,每个堆栈跟踪结构404-416与标记“没有被缓存”或“in_cache”关联。每次请求新的调用,可以产生堆栈结构以保留这个调用所需的信息,适时式(JIT)编译器可以将它标记为“没有被缓存”。根据一种实施例,通过程序处理继续到该堆栈的下一结构402继续展开,直到它达到Stacktrace.main404。在展开的过程中在达到“没有被缓存”结构时,可以将该结构标记为“处于缓存”。一旦实现了完全展开,则所有的结构404-416可以标记为“处于缓存”。此外,所有的结构404-416可以具有存储在堆栈跟踪中的并通过指令指针和堆栈指针对标引的附加的或额外的堆栈跟踪信息。根据一种实施例,指令指针可以识别该堆栈跟踪的结构信息、源位置和方法名称,同时堆栈指针可以区别那些具有相同的指令指针的堆栈结构,例如堆栈结构412和416。此外,例如,指令指针可以识别堆栈跟踪的每个堆栈结构的帧信息,并且使用通过相应的指令指针标识的帧信息,堆栈指针可以分开每个堆栈结构。附图5所示为根据一种实施例原理性地示出了三个堆栈跟踪和最佳展开的过程的方块图。如图所示,三个堆栈跟踪552、562、578包括在执行软件程序的过程中的第一堆栈跟踪552、在第一异常堆栈展开之后的第二堆栈跟踪562和在第二展开的过程中的第三堆栈跟踪578,展开直到到达“处于缓存”结构。根据一种实施例,在软件程序的开始执行的过程中编译器可以将第一堆栈跟踪552的堆栈结构554-560标记为“没有被缓存”。第一堆栈跟踪552包括一组结构554-560。如图所示,第一堆栈跟踪552可以包括Stacktrace.main主程序的堆栈结构554、表示由主程序554调用的程序B.b的堆栈结构556、表示由程序A.a调用的程序B.b的堆栈结构558和表示由程序B.b调用的程序C.c的堆栈结构560。根据一种实施例,第二堆栈跟踪562可以包括一组堆栈结构564-576。在此,在展开的过程中通过将“处于缓存”槽(slot)设定为真,将先前标记为“没有被缓存”的每个堆栈结构554-560以及其它的结构标记“处于缓存”564-574。根据一种实施例,在第二次展开之后第三堆栈跟踪578可以具有堆栈结构580-594,直到到达“in_cache”。根据一种实施例,堆栈展开可以从标记“没有被缓存”的堆栈结构G.g0594开始。由于G.g0594结构没有被缓存,因此可以将槽值复位到“处于缓存”,并且展开的过程可以继续到下一结构。一旦到达已经“处于缓存”堆栈结构B.b584,则可以从堆栈跟踪高速缓存器中检索其余的堆栈跟踪信息(比如,指令指针和堆栈指针对),而不需要附加的展开。此外,根据一种实施例,通过使用存储在堆栈跟踪高速缓存器中的第一或更早的异常的堆栈跟踪信息可以使堆栈展开更加快。根据另一实施例,“处于缓存”结构采样可以改变大小,例如在展开的过程中为获得进一步的运行时间好处包括相对较大的“处于缓存”结构采样。根据一种实施例,与在此为说明的目的提供的较少的采样相比,典型的采样可能具有更大数量的“处于缓存”结构,因此在展开的过程可以获得更大的运行时好处。根据一种实施例,可以考虑本发明的某些实施例所需的各种部件和/或步骤的任何组合,并且这些组合可以基于给定的情况、需求、性能、预定的策略和/或标准等。也可以考虑并非需要所有的部件和/或步骤,也可以增加几个其它的部件和/或步骤,这对于本领域的普通技术人员来说是显而易见的。可以使用常规的技术以及对本领域的普通技术人员来说是显然的任何所需的改进。例如,该系统可以包括执行指令的常规的处理器或机器、存储数据的常规存储器、对数据编码的常规编码器、发送数据的常规发送器、接收数据的常规接收器和对数据进行解码的常规解码器。本发明的某些实施例根据需要可以包含服务器、应用程序、系统、数据库和各种其它的设备和/或软件。例如,各种系统可以起多平台的作用和/或具有多平台,比如虚拟地址扩充系统(VAX)、大型机(Mainframe)、个人计算机(PC)、ActiveDirectory、Novell、Macintosh、UNIX、Linux等以及备用机。虽然已经描述了本发明,但是在本领域的普通技术人员会理解到各种改进及其变型。权利要求1.一种方法,包括确定堆栈结构跟踪的最后堆栈结构是否是没有被缓存;如果最后堆栈结构是没有被缓存则记录调用者-被调用者关系;和更新带有所记录的调用者-被调用者关系的关系映射。2.权利要求1所述的方法,进一步包括以缺省值初始化堆栈结构跟踪;将最后没有被缓存的堆栈结构标记为处于缓存;和展开到堆栈结构跟踪的下一堆栈结构。3.权利要求1所述的方法,进一步包括检测所述堆栈结构跟踪的最后堆栈结构;确定堆栈结构跟踪的最后结构是否是处于缓存;和如果最后的堆栈结构是处于缓存则退出展开。4.权利要求1所述的方法,进一步包括检测堆栈结构跟踪的底部;和如果已经到达了堆栈结构跟踪的底部则退出展开。5.权利要求2所述的方法,其中初始化包括初始化指令指针和堆栈结构数据结构,该堆栈结构数据结构具有方法查询表。6.权利要求5所述的方法,其中方法查询表包括对应于调用者-被调用者关系的调用者和被调用者的代码地址,该代码地址具有每个方法的开始和结束地址。7.权利要求1所述的方法,其中该关系映射包括散列表,该散列表具有作为表示调用者-被调用者关系的键标的调用点和作为指示执行调用点的次数的值的计数。8.权利要求1所述的方法,进一步包括将堆栈结构跟踪的堆栈结构标记为处于缓存,其中一旦完成全部展开就执行标记。9.权利要求7所述的方法,其中堆栈结构包括堆栈跟踪信息,该堆栈跟踪信息由指令指针和堆栈指针对标引。10.一种方法,包括检验关系映射以周期性地监测多个调用者-被调用者对;确定这些多个调用者-被调用者对中的一个调用者-被调用者对是否是热门的;重新编译对应于热门的调用者-被调用者对的调用者;和内嵌对应于热门的调用者-被调用者对的被调用者。11.权利要求10所述的方法,其中该关系映射包括散列表,该散列表具有作为表示调用者-被调用者关系的键标的调用点和作为指示执行调用点的次数的值的计数。12.权利要求10所述的方法,其中确定热度包括达到或超过热度阈值的计数,该热度阈值由预定的策略或标准确定。13.权利要求10所述的方法,进一步包括找出作为热门的所述多个调用者-被调用者对中的若干调用者-被调用者对;重新编译该若干热门的调用者-被调用者对的第一调用者;和内嵌对应于该若干热门的调用者-被调用者对的若干被调用者。14.权利要求10所述的方法,其中周期性地监测包括基于预定的策略或标准周期地监测。15.权利要求14所述的方法,其中周期性地监测包括多个调用者-被调用者对的监测的周期性地停止和开始。16.权利要求10所述的方法,其中预定的策略或标准包括如下的策略或标准中的一个或多个监测多个调用者-被调用者对中的每个调用者-被调用者对花费的时间、监测的调用者-被调用者对的数量和发布的再编译请求的数量。17.一种系统,包括处理器;和与处理器耦合的存储介质,在该存储装置上已经存储了表示指令序列的数据,在通过处理器执行时该指令序列使处理器以缺省值初始化堆栈结构跟踪;检测堆栈结构跟踪的最后堆栈结构;确定最后堆栈结构是否是没有被缓存;如果最后堆栈结构是没有被缓存则记录调用者-被调用者关系;和用记录的调用者-被调用者关系更新关系映射。18.权利要求17所述的系统,进一步包括具有Java虚拟机、Java适时式编译器、Java编译器或Java芯片的编译器。19.权利要求17所述的系统,进一步包括检验该关系映射以周期性地监测多个调用者-被调用者对的再编译调度程序。20.一种设备,包括处理器;和与处理器耦合的存储介质,在该存储装置上已经存储了表示指令序列的数据,在通过处理器执行时该指令序列使处理器确定堆栈结构跟踪的最后堆栈结构是否是没有被缓存;如果最后的堆栈结构是没有被缓存则记录调用者-被调用者关系;和以记录的调用者-被调用者关系更新关系映射。21.权利要求20所述的设备,其中在通过处理器执行时该指令序列进一步使处理器以缺省值初始化堆栈结构跟踪;将最后堆栈结构标记为处于缓存;和展开到堆栈结构跟踪的下一堆栈结构。22.权利要求20所述的设备,其中在通过处理器执行时该指令序列进一步使处理器检测堆栈结构跟踪的最后堆栈结构;确定堆栈结构跟踪的最后帧是否是处于缓存;和如果最后堆栈结构是处于缓存则退出展开。23.一种机器可读的介质,在该介质上存储了表示指令序列的数据,在通过机器执行时该指令序列使机器确定堆栈结构跟踪的最后堆栈结构是否是没有被缓存;如果最后的堆栈结构是没有被缓存则记录调用者-被调用者关系;和以记录的调用者-被调用者关系更新关系映射。24.权利要求23所述的机器可读的介质,其中在通过机器执行时该指令序列进一步使机器以缺省值初始化堆栈结构跟踪;将最后堆栈结构标记为处于缓存;和展开堆栈结构跟踪的下一堆栈结构。25.权利要求23所述的机器可读的介质,其中在通过机器执行时该指令序列进一步使机器检测堆栈结构跟踪的最后堆栈结构;确定堆栈结构跟踪的最后结构是否是处于缓存;和如果最后堆栈结构是处于缓存则退出展开。26.权利要求24所述的机器可读的介质,其中初始化包括初始化指令指针和堆栈结构的数据结构,该堆栈结构的数据结构具有方法查询表。27.一种机器可读的介质,在该介质上存储了表示指令序列的数据,在通过机器执行时该指令序列使机器检验关系映射以周期性地监测多个调用者-被调用者对;确定这些多个调用者-被调用者对中的一个调用者-被调用者对是否是热门的;重新编译对应于热门的调用者-被调用者对的调用者;和内嵌对应于该热门的调用者-被调用者对的被调用者。28.权利要求27所述的机器可读的介质,其中该关系映射包括散列表,该散列表具有作为表示调用者-被调用者关系的键标的调用点和作为指示执行调用点的次数的值的计数。29.权利要求27所述的机器可读的介质,其中确定热度包括达到或超过热度阈值的计数,该热度阈值由预定的策略或标准确定。30.权利要求27所述的机器可读的介质,其中在通过机器执行时该指令序列进一步使机器找出作为热门的所述多个调用者-被调用者对中的若干调用者-被调用者对;重新编译该若干热门的调用者-被调用者对的第一调用者;和内嵌对应于该若干热门的调用者-被调用者对的若干被调用者。全文摘要描述了一种使用堆栈跟踪高速缓存器内嵌的方法、系统和设备。根据一种实施例,确定堆栈结构跟踪的最后堆栈结构是否的没有被缓存,以及如果最后堆栈结构是没有被缓存,则记录调用者-被调用者关系,并以所记录的调用者-被调用者关系更新关系映射。文档编号H02H3/05GK1534475SQ03125590公开日2004年10月6日申请日期2003年9月18日优先权日2003年3月28日发明者G·吴,G·-Y·吕,G吴,ヂ申请人:英特尔公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1