用于改进爪哇虚拟机性能的方法和系统的制作方法

文档序号:6510576阅读:305来源:国知局
专利名称:用于改进爪哇虚拟机性能的方法和系统的制作方法
技术领域
本发明涉及一种用于改进Java(Sun微系统公司的注册商标)虚拟机性能的方法和系统,更具体地讲,涉及一种用于通过将传统的基于以一字节为单位的Java字节码转换成具有扩展为传统Java字节码四倍的四字节大小的数据类型的代码而提高Java程序的执行速度的方法。
背景技术
Java(爪哇)编程语言自二十世纪九十年代中期出版以来已经快速地激增,但是存在着它们的代码与如C或C++的其它编程语言组成的代码相比具有慢的运算速度的缺点。为了克服这个缺点,两种应用到传统的基于解释器的Java虚拟机的技术以前已经被建议一种是动态代码产生技术如实时(Just-In-Time)编译器,另一种是静态代码产生技术如预先(Ahead-Of-Time)编译器。
Java平台基本包括Java虚拟机和Java类。类文件由与类的数据结构相关的信息组成,包括字段信息(field information)、方法信息等等。方法的执行代码由与硬件或操作系统无关的字节码形成。
通过根据执行引擎来分类传统的Java虚拟机,它能被区分为基于解释器的Java虚拟机、基于实时(JIT)编译器的虚拟机、使用基于解释器和基于JIT编译器的Java虚拟机的Java虚拟机、基于预先(AOT)编译器的Java虚拟机等等。
基于解释器的Java虚拟机解释旨在逐一地执行的方法的字节码,由此执行应用。JIT编译器通过编译字节码来获得依赖于当前Java平台的机器语言代码,然后执行机器语言代码以实施应用。
图1示出一种传统的Java虚拟机的结构。Java虚拟机100包括解释器110、JIT或AOT编译器120、用于装载类的类装载器130、用于结合并操作组件110、120和130的运行时系统(run time system)140、将被执行的应用类150和以前已经定义的系统类160。
图2示出一种传统的Java类文件的一般配置。
类文件包括类或接口定义,并且由定义在类中的各种属性、字段信息、方法信息等组成。方法信息定义被称为字节码并规定在解释器中执行的字节流。字节码从编译包含Java源语言语句的文件(如具有“java”扩展的文件)而获得。
字节码类似于用于执行的程序模块,因为在计算机内部其被一次一个字节地执行。但是字节码的指令是被发送到逻辑和抽象的Java虚拟机的实际的指令。字节码能够由JIT编译器再次编译以和特定系统平台兼容,包括它需要仅一次被一个字节解释,因此加速了Java程序的执行速度。作为增加解释器中的Java程序的执行速度的一种方法,有在字节码内的操作码的位置上写解释器内的操作码处理程序地址的“线程解释器”技术。
图3示出在传统Java虚拟机中被执行的字节码。
字节码的指令由操作数和操作码组成,两者都有一字节的大小以区别所执行的操作。一个操作码可包括几个操作数。操作码和每个操作数都以一字节为单位被存储,从而它们被表示成连续字节以表示具有一个或多个字节大小的操作数。例如,16位值由两个连续字节组成和32位值由四个连续字节组成。
在图3中,第一行表示实际的字节码的十六进制值,第二行表示被分成操作码和操作数的字节码。
图4示出在传统Java虚拟机中装载和执行类的过程。
应用类由Java虚拟机的类装载器载入(S400),并经历链接过程(S410)和初始化过程(S420),然后相关信息被存储在运行时系统内的数据结构中,并由如解释器或JIT编译器的执行引擎来执行方法(S430)。
图5是显示在传统Java解释器中执行每一操作码的示例性的操作的流程图。
在典型的解释器中,字节码以图5所示的方式被执行。当在解释器中调用方法时(S500),指示该方法的字节码的程序计数器递增(S510),然后确定该方法的字节码是否是最后的字节码(S520)。如果该方法的字节码不是最后的字节码,那么取出一字节的操作码(S530)。随后,控制使用程序中的切换语句来转向对应于所取的一字节操作码的处理程序,从而,执行处理程序(S540和S550)。这个过程随着字节码的大小被多次重复,然后用于该方法的解释过程终止(S560)。
图5所示的过程能够用下面的伪代码来表示Loop{Op=*pc++;switch(Op){case op_1//op_1的执行break;case op_2//op_2的执行break;case op_3//op_3’的执行break;…}}在对各个操作码的处理程序中,如果操作码所需的操作数的数据大小大于1字节,那么操作数的值就以连续字节被储存。因此,按每一位通过“或”运算符和移位运算符,连续字节被重构成一有效值。例如,在使用“小头(LittleEndian)”格式的CPU中,如果某一操作码A所需的操作数是在连续的字节字节1、字节2、字节3和字节4中,那么,字节4表示被逻辑地指示的32位值的第一位到第八位,字节3表示被逻辑地指示的32位值的第九位到第十六位,字节2表示被逻辑地指示的32位值的第十七位到第二十四位,字节1表示被逻辑地指示的32位值的第二十五位到第三十二位。
因此,操作码A实际所需的32位值能够通过像“[(byte1<<24)|(byte1<<16)|(byte1<<8)|byte4]”的操作而获得。在现有的Java虚拟机中,结合这样的操作数的过程在方法被执行的任何时候发生。
因为现在许多CPU具有32位体系结构并使用内置的32位寄存器,所以取出32位数据显示出比取出8位数据更好的性能。
此外,在传统的Java字节码中,因为操作码和操作数以一字节为单位被存储,所以操作码的位大小被限制到8位,这能表示最大仅256个不同的位配置。因此,一旦预定的操作码被排斥,那么剩余的能够专用于新的可定义的操作码的位配置的数量受到相当大地限制。因为这个原因,在其中需要许多可再定义的操作码的动态代码产生技术上存在许多限制。
对于操作数来讲,当操作数的数据大小大于1字节时,那么操作数将以连续字节被排列,并且,连续字节按每一位通过“或”运算符和移位运算符在执行方法的任何时候将被重构。当Java程序被执行时,这个过程运行可能以大量的系统开销来运行。因此,需要通过克服这些限制来改进Java虚拟机的性能。

发明内容
因此,本发明的目的直接在于通过提供一种方法来解决上述在现有技术所发生的问题,该方法通过将传统的以一字节为单位的Java字节码转换成具有被扩展为传统的Java字节码四倍的4字节大小的数据类型的代码(以下称作为“中间代码”的代码),而提高Java虚拟机的执行速度。然而,本发明的实施例没有被要求解决这里所描述的任何问题。
为了实现上述目的,本发明提供一种用于改进Java虚拟机的性能的方法。该方法包括第一步骤,抽取组成Java类的方法的字节码;第二步骤,合并抽取的字节码、产生具有预定字节大小的第二代码,并且将第二代码分配给预定类型的数据结构;和第三步骤,由组成Java虚拟机的执行引擎执行第二代码。在这种情况下,最好但并非必要的是字节大小取决于配备有Java虚拟机的中央处理单元的数据处理能力。
最好但并非必要的是数据结构是整数类型之一。
最好但并非必要的是如果所抽取的字节码的至少两个字节被合并以表示逻辑值,那么第二步骤是这样一个步骤,其用于合并该至少两个字节、产生具有预定字节大小的第二代码,并且将第二代码分配给预定类型的数据结构。
最好但并非必要的是当所抽取的字节码是使用宽的操作数的操作码时,第二步骤是这样一个步骤,其用于将操作码转换成不使用宽的操作数的操作码、产生具有已转换的操作码的预定字节大小的第二代码,并且将第二代码分配给数据结构。
为了实现上述目的,本发明提供一种配备着有Java虚拟机的系统,其中,Java虚拟机抽取组成Java类的方法的字节码,合并所抽取的字节码,产生具有预定字节大小的第二代码,将第二代码分配给预定类型的数据结构,并且允许由组成Java虚拟机的执行引擎来执行第二代码。这种情况下,数据结构是整数类型之一。
最好但并非必要的是字节大小取决于配备有Java虚拟机的中央处理单元的数据处理能力。
最好但并非必要的是当所抽取字节码的至少两个字节被合并以表示逻辑值时,系统合并该至少两个字节并产生具有预定字节大小的第二代码。
最好但并非必要的是当所抽取的字节码是使用宽的操作数的操作码时,系统将使用宽的操作数的操作码转换成不使用宽的操作数的操作码,并产生具有已转换的操作码的预定字节大小的第二代码。


通过结合附图,从下面详细的描述中,本发明的上述和其他示例性目的、特点和优点将会变得更加清楚,其中图1示出传统的Java虚拟机的结构;图2示出传统的Java类文件的一般结构;图3示出在传统的Java虚拟机中被执行的字节码;图4示出在传统的Java虚拟机中类装载和执行的过程;图5是显示在传统的Java解释器中执行每个操作码的示例性操作的流程图;图6是显示根据本发明示例性的实施例的包括转换器的Java虚拟机的结构的方框图;图7示出在根据本发明示例性的实施例的Java虚拟机中装载和执行类的过程;图8是显示根据本发明示例性的实施例的转换字节码的过程的一个示例的流程图;和图9示出在根据本发明示例性的实施例的Java虚拟机中被执行的字节码。
具体实施例方式
以下,将参照附图根据本发明的各种示例性、非限制性的实施例来进一步详细描述关于一种用于改进Java虚拟机性能的方法和系统。
图6是显示根据本发明示例性的实施例的包括转换器的Java虚拟机的结构的方框图;图6示出根据本发明示例性的实施例的包括在传统的Java虚拟机没有被发现的转换器630的Java虚拟机的结构,其中转换器630通过排列字节码的四个字节将1字节的字节码转换成4字节的字节码。换句话说,Java虚拟机600除了传统的Java虚拟机被提供的解释器610、JIT编译器620、类装载器640、运行时650、应用类660和系统类670外,还被提供转换器630。转换器630能够以线程类型来被实现。
图7示出在根据本发明示例性的实施例的Java虚拟机中装载和执行类的过程。
在Java虚拟机600中由类装载器640装载一新的类(S700),然后调用转换器630。随后,关于在被装载的类中声明的每一方法,转换器630通过排列四个1字节的字节码将字节码转换成中间代码(int-code)(S710)。
在步骤S710之后,并且类似于在图4的传统方法中所示的步骤,执行链接过程(S720)和初始化过程(S730),然后由执行引擎执行每一方法(S740)。
用程序代码表示步骤S710的过程如下Int[]byte-To-int(char*byte-code,int size_of_byte-code){int*int-code;int-code=(int*)malloc(4*size_of_byte-code)//分配4倍于当前字节码大小的存储器Loop{char*pc;int int-codePC=0;pc=byte-code;Op=*pc++;switch(OP){case opcode_1//用于opcode_1的中间代码转换方案pc++
int-codePC++;break;case opcode_2;//用于opcode_2的中间代码转换方案pc++;int-codePC++;break;}}}以下,将解释程序代码。
当在Java虚拟机上装载新类时,对在类中声明的每一方法,调用转换器630。在这种情况下,转换器630接收方法字节码和该方法字节码的大小作为输入参数。
在转换器630中,至少为该方法大小的四倍的存储器被分配,并且分配的存储器使用是32位整数指针的中间代码指示。中间代码随后是大的循环,其继续循环直到没有字节从字节码中取出。该循环具有一个在其中用于转换每一操作码的例行程序被定义的切换语句。
图8是显示根据本发明示例性的实施例的转换字节码的示例性过程的流程图。
当类装载器装载新类时,转换字节码的过程开始(S800)。首先,检查由当前的程序计数器指示的操作码是否具有宽的索引作为操作数(S810)。在操作码不需要宽的操作数的情况下,操作码被存储在中间代码中(S830)。
在操作码需要宽的操作数的情况下,操作码在Java虚拟机版本2上起着相同的作用,但是另一不需要宽的操作数的操作码被发现,然后被发现的操作码作为代替被存储在该中间代码中(S810和S820)。
例如,“jsr_w”是被定义在Java虚拟机版本2中的指令之一,并且和“jsr”指令起着相同的作用。此时,在“jsr_w”指令中,32位宽的索引被分配给操作数(作为四个连续字节),而在“jsr”指令中,16位索引被分配给操作数(作为两个连续字节)。
换句话说,“jsr”指令而不是“jsr_w”指令被存储在中间代码阵列中。因此,带有宽的操作数的操作码被去除,从而,当产生动态代码时,这些操作码能够被重新定义以使可用的。以这种方式,当操作码被提供32位码元(element)时,在32位码元中除了操作码的大小(即8位)外24位保持为空。此时,24位的空白空间能够被用作存储字段,对于该存储字段JIT技术被应用于操作码和随后的几个字节码,并且所得的代码块地址等和定义指示JIT技术被应用到其的新操作码的一字节的剩余部分一起被插入到空白空间。
在完成步骤S830后,指示新字节码的程序计数器和指示中间代码的中间代码PC都递增。当操作码带有操作数时,操作数必须被插入到中间代码中。在这种情况下,必须检查操作数是否大于一字节(S840和S850)。换句话说,在操作数由连续字节组成的情况下,在将操作数插入到中间代码中之前,操作数依照当前由按位操作的“或”运算符和移位运算符使用的CPU的头格式(Endian format)被合并之后被存储在一个中间代码中(S860和S870)。当与一个或多个字节合并的操作数的大小不大于四字节时,有可能将操作数存储在中间代码的一个码元中。因为执行该操作的操作过程在执行方法前仅仅实施一次上述的操作数合并,所以它能够获得比传统的解释器更好的性能。如果连续字节的数目是n,那么合并的结果被提供一个中间代码,然后另外n-1个中间代码被设置空白空间。
图9示出在根据本发明示例性的实施例的Java虚拟机中被执行的字节码。
例如,原有的字节码“goto”通过中间代码转换算法被转换成“int-code
”值。插入“nop”(即非运算指令)的原因是提高当解释器在中间代码方案中被转换时的方便,并且插入值可以根据实施方案而不同。
根据本发明的实施例,通过扩展字节码和在解释器或JIT编译器应用于其的Java虚拟机中将它转换成中间代码或32位阵列,本发明具有改进配备32位CPU的硬件的执行速度的效果,和具有使用阵列的空白空间容易地存储和监视与各个操作码相联系的附加信息的效果。此外,因为本发明不再使用用于处理宽的操作数的宽的操作码,所以本发明具有这些不用的操作码能够被再定义为新的被用户定义的操作码的优点。
从前述能够看出,本领域的技术人员应该理解,因为在不脱离其中的精神和范围的情况下可以对本发明做各种改变、变化和修改,所以本发明不限于上述的具体实施例或附图。
权利要求
1.一种用于改进Java虚拟机性能的方法,该方法包括抽取Java类的方法的字节码;合并所抽取的字节码,产生具有预定字节大小的第二代码,并且将第二代码分配给预定类型的数据结构;和由Java虚拟机的执行引擎执行第二代码。
2.根据权利要求1所述的方法,其中,字节大小取决于配备有Java虚拟机的中央处理单元(CPU)的数据处理能力。
3.根据权利要求1所述的方法,其中,数据结构是整数类型的数据结构。
4.根据权利要求1所述的方法,其中,当所抽取的字节码的至少两个字节被合并以表示逻辑值时,合并、产生和分配的步骤分别包括合并该至少两个字节,产生具有预定字节大小的第二代码,和将第二代码分配给数据结构。
5.根据权利要求1所述的方法,其中,当所抽取的字节码是使用宽的操作数的操作码时,合并、产生和分配的步骤分别包括将使用宽的操作数的操作码转换成不使用宽的操作数的操作码,产生包括已转换的操作码的具有预定字节大小的第二代码,和将第二代码分配给数据结构。
6.一种包括Java虚拟机的系统,其中,Java虚拟机抽取Java类的方法的字节码,合并所抽取的字节码,产生具有预定字节大小的第二代码,将第二代码分配给预定类型的数据结构,并且允许由Java虚拟机的执行引擎来执行第二代码。
7.根据权利要求6所述的系统,其中,数据结构是整数类型之一。
8.根据权利要求6所述的系统,其中,字节大小取决于配备有Java虚拟机的中央处理单元(CPU)的数据处理能力。
9.根据权利要求6所述的系统,其中,当所抽取的字节码的至少两个字节被合并以表示逻辑值时,该系统合并该至少两个字节以产生具有预定字节大小的第二代码。
10.根据权利要求6所述的系统,其中,当所抽取的字节码是使用宽的操作数的操作码时,该系统将使用宽的操作数的操作码转换成不使用宽的操作数的操作码,并且产生包括已转换的操作码的具有预定字节大小的第二代码。
全文摘要
一种用于改进Java虚拟机性能的方法和系统,包括抽取组成Java类的方法的字节码;合并所抽取的字节码以产成具有预定字节大小的第二代码,并且将第二代码分配给预定类型的数据结构;和由在Java虚拟机中被使用的执行引擎来执行第二代码。
文档编号G06F9/44GK1641587SQ20051000207
公开日2005年7月20日 申请日期2005年1月14日 优先权日2004年1月17日
发明者权浩凡, 罗曼奥弗斯基·亚历克塞, 崔正必, 赵雄石 申请人:三星电子株式会社
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1