语言虚拟机中热点中间代码的识别方法以及装置的制造方法

文档序号:9750623阅读:210来源:国知局
语言虚拟机中热点中间代码的识别方法以及装置的制造方法
【技术领域】
[0001]本发明涉及编译技术,具体涉及一种热点中间代码的识别方法以及装置。
【背景技术】
[0002]在代码的执行过程中,为了屏蔽平台的差异性,首先要把源代码转换为中间代码,然后运行在各自的语言虚拟机,语言虚拟机为运行中间代码的虚拟机,例如执行JAVA的中间代码(字节码)的JAVA虚拟机(JVM,Java Virtual Machine ) —般包括解释器(Interpreter)、即时(JIT,Just In Time)编译器。在中间代码的执行过程中,解释器用于在程序启动时,对中间代码进行逐个翻译并执行,执行效率比较低,即时编译器用于将中间代码编译为用于被调用执行的本地代码,本地代码的执行效率比较高。一些即时编译器又可以细分为轻量级编译器、重量级编译器。重量级编译器相比轻量级编译器优化手段更丰富,编译效果更好,但编译时开销更大。
[0003]然而,在不能有效地识别热点的中间代码(执行频率高的中间代码)时,使得即时编译器编译出执行频率低的本地代码,这些执行频率低的本地代码占据了大量存储空间,会影响接下来的执行频率高的中间代码的编译过程,造成了存储空间浪费且严重影响语言虚拟机整体运行性能。

【发明内容】

[0004]本发明的目的在于提供一种热点中间代码的识别方法以及装置,用于识别热点的中间代码。
[0005]上述目标和其它目标将通过独立权利要求中的特征来达成。进一步的实现方式在从属权利要求、说明书和附图中体现。
[0006]第一方面,提供一种热点中间代码的识别装置,所述装置包括:
[0007]获取电路,用于在待识别函数被语言虚拟机执行时,获取指令计数器中的指令地址;
[0008]第一判断电路,用于根据所述获取电路获取的所述指令计数器中的指令地址,判断所述指令计数器中的指令地址对应的本地指令是否为所述待识别函数的本地指令;
[0009]更新电路,用于在所述第一判断电路确定所述指令计数器中的指令地址对应的本地指令为所述待识别函数的本地指令时,将所述待识别函数的当前的热度值增加预设值,以更新所述待识别函数的热度值;
[0010]第二判断电路,用于判断所述更新电路得到的所述待识别函数的更新后的热度值是否大于或等于所述待识别函数的热度阈值,在所述待识别函数的更新后的热度值大于所述待识别函数的热度阈值时,将所述待识别函数的中间代码作为热点中间代码。
[0011]其中,更新所述待识别函数的热度值指的是用新的热度值来替换当前的热度值,当前的热度值在更新前后会发生改变,更新之后的当前的热度值,或者说更新后的热度值就变成了更新前的那个新的热度值。
[0012]该装置通过获取指令计数器中的指令地址,判断所述指令计数器中的指令地址对应的本地指令是否为所述待识别函数的本地指令,使得可以实现在解释器或是即时编译执行代码的过程中识别出热点中间代码。
[0013]根据第一方面,在所述装置第一种可能的实现方式中,所述第一判断电路用于:
[0014]判断所述指令计数器中的指令地址是否在所述待识别函数的本地指令空间的地址范围内,所述待识别函数的本地指令空间中的本地指令包括所述待识别函数的本地指令,并且所述待识别函数的本地指令空间中的本地指令不包括用于实现所述语言虚拟机功能的本地指令。该实现方式可以有效区分当前正在执行的指令是用于实现语言虚拟机自身功能的本地指令,还是语言虚拟机执行的函数的本地指令,从而简单且有效的实现判断所述指令计数器中的指令地址对应的本地指令是否为所述待识别函数的本地指令。其中函数也可以称为方法,用于实现语言虚拟机自身功能的本地指令也可以称为主机端代码中的指令,语言虚拟机执行的函数的本地指令也可以称为客户端代码中的指令。
[0015]根据第一方面的第一种实现方式,在所述装置第二种可能的实现方式中,所述语言虚拟机包括解释器,所述待识别函数的本地指令空间中的本地指令包括用于中的本地指令包括所述解释器翻译的中间指令对应的本地指令,所述用于所述解释器翻译的中间指令对应的本地指令包括所述待识别函数的本地指令。
[0016]相应的,所述待识别函数被执行可以包括:所述待识别函数的中间代码被执行。
[0017]在语言虚拟机中的解释器翻译中间代码的过程中,所有中间指令对应的本地指令被存储在连续的存储空间,也就是可通过所述解释器翻译获得的本地指令的存储空间,所述存储空间可以是内存空间,所述本地代码可以是汇编代码,所述中间代码也可以是字节码,通过判断当前执行的本地指令的指令地址是否在可通过所述解释器翻译获得的本地指令的存储空间的地址范围内,可实现解释器翻译阶段中判断所述指令计数器中的指令地址对应的本地指令是否为所述待识别函数的本地指令。
[0018]根据第一方面的第一种实现方式,在所述装置第三种可能的实现方式中,所述语言虚拟机包括及时编译器,所述待识别函数的本地指令空间用于存储所述待识别函数的本地代码,所述待识别函数的本地指令为所述待识别函数的本地代码中的指令,所述待识别函数的本地代码通过所述及时编译器编译获得。
[0019]相应的,所述待识别函数被执行可以包括:所述待识别函数的本地代码被执行。
[0020]即时编译器编译获得的所述待识别函数的本地代码,会以所述待识别函数为一个整体,将所述待识别函数的本地代码存储在用于存储所述待识别函数的本地代码的存储空间,其中,该存储空间可以是内存,例如,该存储空间可以是代码缓冲区(code cache),其中所述待识别函数的本地代码可以是通过及时编译器中的轻量级编译器获得的所述待识别函数的轻量级本地代码,也可以是通过及时编译器中的重量级编译器获得的所述待识别函数的重量级本地代码。在所述待识别函数的本地代码为轻量级本地代码时,通过判断当前执行的本地指令的指令地址是否在用于存储所述待识别函数的本地代码的存储空间的地址范围内,可实现在轻量级本地代码被执行阶段中,判断所述指令计数器中的指令地址对应的本地指令是否为所述待识别函数的本地指令;在所述待识别函数的本地代码为重量级本地代码时,通过判断当前执行的本地指令的指令地址是否在用于存储所述待识别函数的本地代码的存储空间的地址范围内,可实现在重量级本地代码被执行阶段中,判断所述指令计数器中的指令地址对应的本地指令是否为所述待识别函数的本地指令,从而实现对重量级本地代码的执行频率的统计。
[0021]根据第一方面,或以上第一方面的任意一种实现方式,在所述装置第四种可能的实现方式中,所述更新电路包括热度值计数器,所述热度值计数器用于:将所述热度值计数器中的所述待识别函数的热度值加I。该热度值计数器为计数器,可以通过输入的电平(例如,通过电平变化的上升沿)来触发计数,从而替代软件计数的实现方式,从而减轻软件实现的负担。并且由于是电路直接实现,使得执行效率更高。
[0022]根据第一方面的第四种实现方式,在所述装置第五种可能的实现方式中,所述第二判断电路包括减法器和用于存储所述待识别函数的热度阈值的阈值寄存器,所述减法器与所述阈值寄存器相连,所述减法器与所述热度值计数器相连,所述减法器用于获取所述热度值计数器中的所述待识别函数的热度值减去所述阈值寄存器中的所述待识别函数的热度阈值的差值,其中,所述差值大于O指示所述待识别函数的更新后的热度值大于或等于所述待识别函数的热度阈值。
[0023]通过将减法器、阈值寄存器以及热度值计数器相连,通过电路实现判断所述待识别函数的更新后的热度值是否大于或等于所述待识别函数的热度阈值的功能,从而进一步降低了代码的运算量,进一步使得执行效率更高。
[0024]根据第一方面的第四种实现方式,在所述装置第六种可能的实现方式中,所述第二判断电路包括第一比较器和用于存储所述待识别函数的热度阈值的阈值寄存器,所述第一比较器与所述阈值寄存器相连,所述第一比较器与所述热度值计数器相连,所述第一比较器用于判断所述热度值计数器中的所述待识别函数的更新后的热度值是否大于或等于所述阈值寄存器中的所述待识别函数的热度阈值。
[0025]通过将第一比较器、阈值寄存器以及热度值计数器相连,通过电路实现判断所述待识别函数的更新后的热度值是否大于或等于所述待识别函数的热度阈值的功能,从而减轻软件实现的负担,进一步使得执行效率更高。
[0026]根据第一方面的第五种或第六种实现方式,在所述装置第七种实现方式的一种可能的实现方式中,所述装置还包括处理器和存储器;所述存储器用于存储代码;所述处理器通过读取所述存储器中存储的所述代码,以用于:
[0027]在所述待识别函数被所述语言虚拟机调用时,加载所述待识别函数的当前的热度值到所述热度值计数器;
[0028]在所述待识别函数被所述语言虚拟机返回时,保存所述热度值计数器中的所述待识别函数的更新后的热度值到所述存储器。
[0029]仅在所述待识别函数被执行期间,令热度值计数器中的值为所述待识别函数的热度值,使得在所述待识别函数不被执行期间,热度值计数器可以被用于其它功能,优化了存储资源的使用。
[0030]根据上述第一方面第七种可能的实现方式,作为第一方面第七种实现方式的另一种实现方式,所述处理器还可以用于在所述待识别函数被所述语言虚拟机调用时,加载所述待识别函数的热度阈值到所述阈值寄存器,以适用于不同函数具有不同的热度阈值的情况,应理解,在待识别函数被所述语言虚拟机返回之后,阈值寄存器可以用于除存储待识别函数的热度阈值之外的其它用途。
[0031]根据上述第一方面第七种可能的实现方式,作为第一方面第七种实现方式的另一种实现方式,所述处理器还可以用于在所述待识别函数被所述语言虚拟机返回时,保存所述阈值寄存器中的所述待识别函数的热度阈值到所述存储器,以适用于待识别函数在执行期间阈值寄存器中的热度阈值发生改变的情况。
[0032]根据第一方面的第七种实现方式,在所述装置第八种可能的实现方式中,所述处理器还用于:在所述待识别函数被所述语言虚拟机调用时,保存所述热度值计数器中的主调函数的更新后的热度值到所述存储器,所述待识别函数为所述主调函数的子函数;
[0033]在所述待识别函数被所述语言虚拟机返回时,加载所述主调函数的当前的热度值到所述热度值计数器。使得主调函数以及待识别函数的热度值可以区分处理。
[0034]在不同函数具有不同的热度阈值时,所述处理器还可以用于在所述待识别函数被所述语言虚拟机返回时,加载所述主调函数的热度阈值到所述阈值寄存器,在所述主调函数执行期间,阈值寄存器中的热度阈值会发生改变时,所述处理器还可以用于在所述待识别函数被调用时,保存所述阈值寄存器中的所述主调函数的热度阈值到所述存储器。
[0035]根据第一方面,或以上第一方面的任意一种实现方式,在所述装置第九种可能的实现方式中,所述获取电路包括与指令计数器相连接的指令地址寄存器,所述指令地址寄存器通过接收触发电平,触发所述获取指令计数器中的指令地址的动作,所述指令地址寄存器还用于存储所述指令计数器中的指令地址。
[0036]通过电路实现获取指令计数器中的指令地址的功能,从而减轻软件实现的负担,进一步使得执行效率更高。
[0037]根据第一方面的第九种实现方式,在所述装置第十种可能的实现方式中,所述待识别函数的本地指令空间为地址连续的存储空间,所述待识别函数的本地指令空间的地址范围用所述待识别函数的本地指令空间的起始地址和所述待识别函数的本地指令空间的终止地址来表示,其中,所述待识别函数的本地指令空间的终止地址大于或等于所述待识别函数的本地指令空间的起始地址;
[0038]所述第一判断电路包括用于存储所述待识别函数的本地指令空间的起始地址的起始地址寄存器,和用于存储所述待识别函数的本地指令空间的终止地址的终止地址寄存器,第三比较器和第二比较器,所述第三比较器与所述指令地址寄存器连接,所述第三比较器与所述起始地址寄存器连接,所述第三比较器用于:比较所述指令地址寄存器中的所述指令计数器中的指令地址是否大于或等于所述起始地址寄存器中的所述待识别函数的本地指令空间的起始地址;
[0039]所述第二比较器与所述指令地址寄存器连接,所述第二比较器与所述终止地址寄存器连接,所述第二比较
当前第1页1 2 3 4 5 6 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1