在虚拟机环境下调用方法的方法和包括虚拟机的系统的制作方法

文档序号:6574155阅读:232来源:国知局
专利名称:在虚拟机环境下调用方法的方法和包括虚拟机的系统的制作方法
技术领域
根据本发明的方法和设备涉及在虚拟机环境下调用方法。更具体地讲,本发明涉及一种调用使用表的方法的改进方法以及包括处理该方法的虚拟机的系统,该表包括多个时隙(slot),在表中写入方法的地址。
背景技术
由于应用程序是依赖硬件的,对于每一应用平台,必须设计相同应用程序的不同的版本。为了开发与平台无关的应用程序,已经开发出抽象化硬件平台的虚拟机。一个代表性的虚拟机是Java虚拟机。
为了实现平台无关,SUNMicrosystems公司开发出Java语言。Java可用于产生用于电子设备(例如微波炉和遥控器)的软件。
为了产生独立于平台的可执行文件,Java将源代码编译为唯一的字节码格式,并且使用Java虚拟机来执行代码。
如图1所示,由例如“javac”的编译器120编译具有“.java”扩展名的Java程序110,并且程序文件被转换为具有“.class”扩展名的Java可执行文件,即,用Java字节码编写的文件。随后,类文件被Java虚拟机(JVM)的内部解析器130解析,并且被执行。
图2示出用于执行Java程序的平台的层结构。层结构包括用Java编写且包括JVM和Java应用程序接口(JAPI)230的Java平台240以及依赖硬件的平台210。在这种结构下,由于Java可执行文件是包括字节码(是平台中立代码)的类文件,因此可在Java运行环境下执行该文件,而不管在哪个系统上开发该程序。
JVM用于执行与平台无关的应用程序,但是与依赖硬件的应用程序相比,其执行速度非常低。换句话说,当执行Java应用程序时,由于JVM中的解析器连续执行字节码程序,因此执行速度低。
为了克服执行速度,开发出即时(JIT)编译器。
在JVM执行Java应用程序的同时,在调用方法的时刻,JIT编译器编译被调用的方法,并且直接执行编译的机器码,而不是字节码。这里,由于编译的机器码存储在存储器中,因此没必要每次都解析该代码,可以为硬件平台最优化虚拟机,并且执行速度高于解析方法。
图3示出在包括JIT编译器的JVM中的方法的状态改变。参照图3,由JIT编译器将字节码310转换为被编译的代码320以快速执行,并且为更快执行来最优化JIT编译的代码320。JIT编译的代码320、330被转换为字节码310以确保存储器。这里,本机码是依赖平台的机器码。
由于当方法改变时,方法的存储地址改变,因此当调用方法时,应考虑方法的地址改变。
传统方法调用操作如下。
首先,执行从类对象获得方法表的加载命令。这里,方法表指示多个数据结构,在数据结构中以数组形式构成多个时隙。随后,执行从时隙读取将被调用的方法的地址的加载命令,并且执行分支到该地址的命令,该时隙中记录了方法的地址。因此,如果被调用的方法的地址改变,则应在方法表中更新与该方法相应的时隙的内容。
根据上述的传统技术,每当调用方法时,应执行从方法表读取方法的地址的处理。然而,在这种情况下,由于在该方法保持不变的情况下执行该处理,所以产生了不必要的系统开销。然而,在具有较少资源的系统中安装的虚拟机的情况下,这种系统开销可很大的影响系统性能。

发明内容
本发明的目的在于提供一种方法调用方法以及具有执行该方法的虚拟机的系统,当在虚拟机环境下调用方法时,所述方法通过直接访问将被调用的方法的地址来最小化系统的开销。
本发明将不限于上述技术目的。本领域的技术人员从接下来的详细描述中可以更加清楚地理解这里没有描述的其他目的。
根据本发明示例性实施例,提供一种在虚拟机环境下的方法调用方法,该方法包括读取第一方法的命令;如果所述命令是调用第二方法的命令,则将命令代码的地址存储在预定存储空间中;改变第二方法的先前编译的代码的地址,并将该地址中写在存储的地址中;和如果执行第一方法,则直接分支到第二方法的新编译的代码的地址,并且调用第二方法。
根据本发明示例性实施例,提供一种系统,包括直接调用信息管理模块,如果第一方法的命令是调用第二方法的命令,则将命令代码的地址存储在预定存储空间中,将先前编译的代码的地址改变为新编译的代码的地址,并将该地址记录在预定存储空间中;和虚拟机,如果执行第一方法,则直接分支到第二方法的新编译的代码的地址,并且调用第二方法。


通过下面结合附图对其示例性实施例进行的详细描述,本发明的上述和其他特点和方面将会变得更加清楚,其中图1示出执行Java程序的一般处理。
图2示出执行Java程序的平台的层结构。
图3示出在包括即时编译器的Java虚拟机中方法的状态改变。
图4是示出根据本发明示例性实施例的编译方法的处理的流程图。
图5示出根据本发明示例性实施例的方法块的结构。
图6示出根据本发明示例性实施例的方法调用的操作。
图7是示出根据本发明示例性实施例的安装虚拟机的系统的框图。
具体实施例方式
将参照附图详细描述本发明的示例性实施例。
通过参照对示例性实施例和附图的详细描述,可更容易理解本发明的方面和特点以及实现所述方面和特点的方法。然而,本发明可以多种不同的形式实现,并且不应解释为限于这里阐述的示例性实施例。相反地,提供这些示例性实施例,从而此公开将是彻底和完整的,并且将本发明的构思完全传达给本领域技术人员,本发明将仅由权利要求限定。
以下将参照根据本发明的示例性实施例的用户接口、方法和计算机程序产品的流程图来描述本发明。将理解,可通过计算机程序指令来实现流程图的每个块、流程图中的多个块的组合。可将这些计算机程序指令提供给通用计算机、专用计算机的处理器,或者其他可编程数据处理设备的处理器以产生机器,从而经由计算机或其他可编程数据处理设备的处理器执行的指令创建用于实现流程图块或多个块中指定的功能的装置。
这些计算机程序指令还可被存储在计算机可用或计算机可读存储器中,这些计算机程序指令可命令计算机或其他可编程处理设备以特定方式工作,从而存储在计算机可用或计算机可读存储器中的指令产生包括实现在流程图块或多个块中指定的功能的指令装置的产品。
计算机程序指令还可被载入计算机或其他可编程数据处理设备以产生将在计算机或其他可编程设备上执行的一系列操作步骤,以产生计算机执行的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图块或多个块中指定的功能的步骤。
流程图的每个块可代表模块、代码段或代码部分,其包括一个或多个实现指定逻辑功能的可执行指令。还应注意在一些可选执行中,多个块中注解的功能可不按顺序发生。例如,顺序显示的两个块实际上可基本上同时执行,或者多个块有时可以相反顺序执行,这取决于涉及的功能。
为了解释方便,假设方法“boo”包括调用类A类型对象“obj”的方法“foo”的代码。
void boo(){A obj=new A();...
obj.foo();...
}这里,图4中示出当方法“boo”被即时编译时执行的操作。
参照图4,当JIT编译器开始编译方法“boo”时,在步骤S410,读取方法“boo”的命令。这里,在步骤S420识别该命令是否为方法“boo”的最后命令。
如果该命令是方法“boo”的最后命令,则在执行步骤S460之后,完成该方法的编译,否则,执行步骤S430、S440和S450。稍后描述步骤S460的操作。
在步骤S420,如果当前命令不是方法“boo”的最后命令,则在步骤S430,JIT编译器编译当前命令。这里,在步骤S440,检查编译的命令是否是对方法“foo”的调用。
这里,在编译的命令不是对方法“foo”的调用的情况下,通过返回步骤S410读取方法“boo”的下一命令,否则,在步骤S450,JIT编译器将已经调用方法“foo”的代码的地址存储在存储了直接调用信息的存储空间中。
这里,如图5所示,直接调用信息可被存储在方法块500中。
方法块500存储关于方法“foo”的信息,例如解析器代码信息,解析器代码信息代表方法“foo”的字节码、方法“foo”的代码大小以及方法“foo”的代码的开始位置,并且方法块500包括调用方法“foo”的直接调用信息。除了直接调用信息510之外的其他信息可以是存储在传统方法块中的信息。
通过经由调用方法“foo”的代码的地址(指示为图5中的“位置1”和“位置2”)或者链接列表连接直接调用信息来管理直接调用信息。
可由JIT编译器执行对直接调用信息的管理,但是也可通过单独的软件模块执行所述管理。
此外,在步骤S420,在当前读取的命令是方法“boo”的最后命令的情况下,在步骤S460,应追踪调用方法“boo”的代码的位置,将先前编译的代码的地址更新为新编译的代码的地址,并且终止方法“boo”的编译。
换句话说,如果完成方法“boo”的编译,则由于从现在开始可由另一方法调用方法“boo”,因此该方法应被调用到新的编译位置。
当根据图4示出的方法完成方法“boo”的编译时,执行与编译的方法“boo”的代码相应的操作。这里,如果在方法“boo”中调用方法“foo”,则不经由单独的方法表来间接地调用方法“foo”。由于调用方法“foo”的方法“boo”的代码的地址存储在存储了直接调用信息的存储空间中,因此,通过记录编译的方法“foo”的地址可直接调用方法“foo”。
图6示出根据本发明示例性实施例的方法调用的操作;假设方法“boo”和方法“zoo”分别包括调用方法“foo”的命令。
参照图6,分支到方法“foo”的命令存在于方法“boo”的编译的代码610的地址0x18中,并且分支到方法“foo”的命令存在于方法“zoo”的编译的代码620的地址0x4C中。
因此,例如当编译方法“boo”和方法“zoo”时,调用方法“foo”的方法“boo”的编译的代码610的地址0x18和调用方法“foo”的方法“zoo”的编译的代码620的地址0x4C被存储在与直接调用信息链接的链接列表520、530中。
此外,在执行方法“boo”的编译的代码610和方法“zoo”的编译的代码620的情况下,当调用方法“foo”时,代码分支到直接方法“foo”的编译的代码630的地址(这里是0x12345678);图6中,该分支表达为“jump0x12345678”。
根据传统技术,在方法“boo”内调用方法“foo”的情况下,执行接下来的处理。
T=0x12341234(步骤1)T=LD(T) (步骤2)JR T (步骤3)在步骤1中,在传统方法表中获得该方法的时隙地址;在步骤2中,从在步骤1中获得的时隙地址中获得已经记录了方法“foo”的编译的代码的地址;在步骤3中,该代码分支到在步骤2获得的地址。
然而,根据本发明,在方法“boo”内调用方法“foo”的情况下,如下仅需要执行一个步骤。
JR 0x12341234(步骤1)此外,在将被调用的方法定义为“私有”或“最终”的情况下,根据上述方法可直接调用该方法。
此外,在应用了根据本发明的方法调用方法的虚拟机中需要修改编译的代码的情况下,当已经停止其他线程的执行时,可共同地处理修改。
此外,在具有应用了根据本发明的方法调用方法的反编译器的虚拟机的情况下,为了克服存储器的不足,可将编译的代码转换为用于解析器的代码。这里,根据传统技术,可使用无用信息收集器的线程停止机制或者可以其他方式停止线程,从而可快速更新方法调用的地址。
图7是示出根据本发明示例性实施例的安装了虚拟机的系统的框图。
参照图7,根据本发明的系统700包括具有直接调用信息管理模块720的虚拟机710。
这里使用的术语“模块”是指但不限于执行特定任务的软件组件或硬件组件,诸如现场可编程门阵列(FPGA)或专用集成电路(ASIC)。模块可被有利地构造为存在于可寻址的存储介质中或被配置在一个或者多个处理器上执行。因此,作为示例,模块可包含组件(诸如软件组件、面向对象的软件组件、类组件和任务组件)、进程、函数、属性、程序、子程序、程序代码段、驱动程序、固件、微代码、电路、数据、数据库、数据结构、表、数组和变量。由组件和模块提供的功能可组合为较少的组件和模块,或可被分成附加的组件和模块。
直接调用信息管理模块720管理上述直接调用信息,并且当方法从使用字节码的方法改变为使用编译的代码的方法或与此相反时,可操作该模块。
这里,直接调用信息管理模块720可以链接列表的形式将调用方法的代码地址存储在被调用方法的方法块中,并且可更新被调用方法的编译代码的地址。由于已经参照图4至图6描述了这种处理,因此这里省略该描述。
此外,在图7中,在虚拟机710中,直接调用信息管理模块720与JIT编译器单独示出,但是JIT编译器可实现为提供由直接调用信息管理模块720提供的功能。
在图7中,由于示出的虚拟机710的无用信息收集器、解析器、反编译器和类加载器与传统技术相同,因此这里省略详细描述。
本领域的普通技术人员应该理解,在不脱离由权利要求限定的本发明的精神和范围的情况下,可在形式和细节上进行各种替换、修改和改变。因此,将理解,上述示例性实施例仅是示例目的,并且不被解释为对本发明的限制。
本发明的方法和设备具有的优点在于,当在虚拟机环境下调用方法时,通过直接访问将被调用的方法的地址来最小化系统开销,从而改善系统性能。
权利要求
1.一种在虚拟机环境下调用的方法,该方法包括读取第一方法的命令;如果所述命令调用第二方法,则将命令代码的地址存储在预定存储空间中;改变第二方法的先前编译的代码的地址,并将改变的第二方法的先前编译的代码的地址写在存储的命令代码的地址中作为新编译的代码的地址;和如果执行第一方法,则直接分支到第二方法的新编译的代码的地址,并且调用第二方法。
2.如权利要求1所述的方法,其中,所述读取步骤包括如果所述命令是最后命令,则通过追踪调用第一方法的代码的位置来将第一方法的先前编译的代码的地址更新为第一方法的新编译的代码的地址。
3.如权利要求1所述的方法,其中,所述预定存储空间包括在第二方法的方法块中。
4.如权利要求1所述的方法,其中,所述预定存储空间由链接列表形成。
5.一种系统,包括直接调用信息管理模块,如果第一方法的命令调用第二方法,则将命令代码的地址存储在预定存储空间中,将第二方法的先前编译的代码的地址改变为第二方法的新编译的代码的地址,并将第二方法的新编译的代码的地址记录在存储的命令代码的地址中;和虚拟机,如果执行第一方法,则直接分支到第二方法的新编译的代码的地址,并且调用第二方法。
6.如权利要求5所述的系统,其中,直接调用信息管理模块追踪调用第一方法的命令代码的位置,并将第一方法的编译的代码的地址更新为第一方法的新编译的代码的地址。
7.如权利要求5所述的系统,其中,所述预定存储空间包括在第二方法的方法块中。
8.如权利要求5所述的系统,其中,所述预定存储空间由链接列表形成。
全文摘要
提供一种在虚拟机环境下调用方法的方法。该方法包括读取第一方法的命令;如果所述命令是调用第二方法的命令,则将命令代码的地址存储在预定存储空间中;改变第二方法的先前编译的代码的地址,并将该地址写在存储的地址中;和如果执行第一方法,则直接分支到第二方法的新编译的代码的地址,并且调用第二方法。
文档编号G06F9/455GK101025694SQ20071007887
公开日2007年8月29日 申请日期2007年2月16日 优先权日2006年2月20日
发明者李相圭 申请人:三星电子株式会社
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1