一种Java虚拟机中位置无关代码的缓存与复用方法

文档序号:6373952阅读:211来源:国知局
专利名称:一种Java虚拟机中位置无关代码的缓存与复用方法
技术领域
本发明属于Java虚拟机技术领域,具体涉及位置无关代码的缓存与复用方法。
背景技术
Java虚拟机作为一种重要的运行时系统,因易于扩展、便于跟踪程序执行和程序移植等优点而被广泛研究。近年来,借助即时编译、并行执行等方法,桌面平台与服务器平台的虚拟机执行效率获得了很大提升。即时编译技术借助动态剖析信息,使虚拟机只关注热方法,缩小了编译器的编译范围,从整体上降低了编译时间开销,减少了编译生成的代码所需存储空间,因此被广泛应用于个人电脑平台、服务器平台甚至嵌入式平台。然而,即时编译系统也给程度执行带来额外开销,如检测延时和编译延时。可执行代码缓存复用是一项重要的降低检测和编译延时的技术。该技术的核心是 针对虚拟机生成的可执行位置无关代码的设计和位置无关代码的缓存与复用管理。代码缓存即将编译生成的可执行代码以文件形式,按一定的格式存储至次级存储设备,如硬盘、闪存等。缓存代码至文件的目的是使其他程序或该程序在之后的运行过程中可以复用功能相同的部分或全部代码。代码缓存复用技术的典型的应用是Unix或Linux操作系统的共享库。共享库中的函数只有一份物理拷贝,但可被不同的进程装载至不同的内存地址空间执行而互不影响,从而既节省代码存储空间又节省编译时间。位置无关代码的常见缓存与复用方法使用符号表和动态链接器共同实现。在编译过程(通常是静态编译)中,编译器从代码中的位置相关处提取所依赖的符号信息,并计算各符号相对于程序地址空间中某一全局固定位置的地址偏移;然后,将符号及其偏移值存储至统一的符号表中;最后,将符号表及其描述信息与代码一起存储至文件系统。这样处理后,代码中所依赖的位置信息被替换为指向符号表中某项的索引,消除了具体地址位置信息,从而实现代码的位置无关。因此,使用符号表,一方面实现了代码的位置无关化,另一方面又完成了对位置无关代码的缓存管理。该方法的实质是将地址位置的直接引用替换为间接引用,将代码中位置相关点的地址绑定操作推迟到运行时完成。因此,该方法还必须配合专门的运行时动态链接器和链接过程,才能使缓存代码得以复用。复用代码时,操作系统需要查询符号表,获得所需符号的当前位置信息,并填充符号表以备后续使用,该过程称为符号的解析过程。如果符号不在当前程序镜像中而在共享库中,那么动态链接器需要加载该共享库其及依赖的共享库并完成必需的符号解析过程,该过程称为符号的链式解析。解析结束后,动态链接器需要加载符号及相关代码,该过程中需要验证许多信息,十分复杂。这使得该方法适用静态编译器却不适于即时编译系统,因为对即时编译器而言,维护符号表、计算符号偏移的开销,属于程序执行时间的一部分,而静态编译器无需考虑这些开销;专门的链接器会增加即时编译器的实现难度,专门的符号链接解析过程会增加程序执行的等待时间
发明内容
本发明的目的在于设计一种高效的位置无关代码缓存与复用方法。该方法使用较小的缓存文件与复用文件开销,同时不需要复杂的数据结构与算法,能简化即时编译器的代码管理,帮助提升虚拟机的执行效率。本发明设计的位置无关代码缓存与复用方法,包括设计缓存文件存储格式和必要元数据信息,以便能高效地实现代码的缓存;设计缓存文件组织方式,以便能高效地复用代码;设计实现缓存检测算法,在运行过程中检测缓存文件的存在性与合法性,并更新各Java方法的缓存状态;依据缓存状态和复用策略,决定如何加载缓存文件中的代码以实现复用。本发明设计的位置无关代码缓存与复用方法,可分为两大部分可执行代码缓存方法与缓存文件复用方法。在可执行代码缓存方法方面,虚拟机按图I所示的缓存文件布局存储位置无关代码,并按图3和图5所示的流程缓存并复用已缓存的代码。图2则展示了本发明所设计的缓存文件组织方法。

第一部分,可执行代码的缓存方法。可执行代码的缓存方法主要包括缓存文件的布局方式,缓存文件的组织策略,位置无关代码缓存。所述的缓存文件布局,如图I所示。从图中可知,缓存文件由头部和内容两部分组成文件头部包括标识该文件类型的魔数(Magic Number),除魔数外剩余文件内容的校验和、该文件的总大小、常量池空间大小、代码区大小以及异常信息表的大小,这些信息主要用于在加载代码前检查文件的完整性并指导内存分配器为即将加载的代码分配空间;文件内容包含代码使用的常量池、可执行代码本身以及异常信息表。本发明使用ccf后缀表示使用图I布局的代码缓存文件。本发明所设计布局策略有以下优点
1.完整性与安全性检验时,可只读元数据信息进行,从而可以快速完成检验过程;
2.加载CCF内容前,元数据中的大小信息可指导以代码管理器提前分配好缓存的可执行代码所需一切存储空间,从而使加载过程变为简单的文件读与内存写操作。所述的缓存文件组织策略,见图2所示。经调研发现,每个类文件包含多个Java方法,各Java方法由不同的索引标识;而不同的类文件由类文件的唯一身份签名标识。因此,本发明使用目录管理缓存文件,一个目录表示一个类文件,而目录中的文件表示该类文件中Java方法的代码缓存。从图2可知,本发明用类唯一标识构造目录名,用方法在类中的索引号构造缓存文件名。该缓存组织策略有如下优点
1.构造命名法直接借用已有标识信息构建文件名及目录名,从而省去复杂的唯一键值过程,降低了方法的实现难度;
2.类目录与缓存文件名的构造规则可用于运行时缓存文件检测,方便高效复用;
3.无需单独维护文件表等信息以记录文件位置,也不必实现文件查找算法,这些工作都由借助文件系统完成,使缓存与复用过程都变得简单。所述位置无关代码缓存,是以缓存文件布局及其组织方式为基础的,在此基础上,本发明设计了缓存流程,具体见图3所示。图中粗线框表示本发明添加的缓存操作。本发明根据Java虚拟机中即时编译器的翻译结果将生成的二进制代码保存到缓存中去。具体过程为在即时编译器生成好位置无关的二进制代码后计算代码的校验和、准备该方法的元信息,然后按照前文所述的缓存文件组织策略和布局存入缓存中。第二部分,缓存文件的复用方法。本发明所设计的复用方法分两阶段缓存文件的存在性检测阶段与缓存文件加载阶段。前者负责检测被调用方法是否存在缓存的代码,并检测代码的合法性(如果确实存在缓存),其算法效率直接影响虚拟机的开销;后者负责在合适时机加载缓存文件并执行加载的代码。本发明使用方法缓存状态在两个阶段间进行相互通信,如图4左侧所示。本发明先检测是否存在代码的缓存版本,并更新检测结果至方法的标志位。然后按图4右侧所设计的方法缓存状态变换规则与变换条件虚拟机启动时,每个方法都被指定为初始状态——UNCHECKED,表示未知存在缓存与否;CACHED,表示该方法已经过缓存检测,且存在可复用的代码缓存版本,缓存加载操作可以在恰当的时机加载该方法的缓存代码;N0CACHE,表示该方法已经被检测过,但目前不存在可复用的代码缓存文件。每一个方法初始都为UNCHECKED状态,在执行到该方法时进行缓存检测,如果没有检测该方法则改变为NOCACHE状态,若缓存文件已存在则改变为CACHED状态,方法的二进制代码在失效或者卸载的时候又会改变为NOCACHE状态。在缓存文件存在性检测阶段,本发明设计如下缓存检测算法1.从方法的类文件 获得类文件的标识信息;2.用类文件标识信息和方法在类文件中方法表里的索引构造出缓存文件的全路径;3.使用文件系统库函数,如access、stat等检测该路径所指向的文件是否存在,并依据返回的检测结果更新方法的缓存状态标志。该方法之所以高效在于文件的位置和索引信息都由文件系统维护,检测文件是否存在的算法和过程也由系统调用函数完成,这使得方法在实现时省去维护缓存文件信息以及提供对这些信息的访问接口的任务;构造路径所需的信息仅为类标识和方法索引,它们都可以在运行时从方法的数据结构体中直接获得,无需额外的存储空间和虚拟机函数调用;路径构造只是字符串拼接操作,本身简单直接。在缓存文件加载阶段,本发明所设计复用策略为方法执行时期MET (MethodExecuting Time)复用,即在方法执行前检查缓存状态,并依据缓存状态确定是否先加载再执行。这与即时编译的基本原理类似,因此MET复用也称为即时加载(Just-In-TimeLoad)。即时加载只加载被执行到的方法,相比于全部复用,该策略从整体上降低了缓存代码的内存空间需求,使资源得到合理利用。图5是本发明所设计的缓存复用操作流程。图中粗线框为本发明所设计内容。与传统的即时编译过程相比,本发明的位置无关代码缓存与复用管理方法为虚拟机提供了一条新的可执行代码来源,该来源与即时编译过程都是在线完成的。具体过程如下首先采用解释执行的方式进入方法的执行,此时进行缓存文件的检测,如果缓存中存在该方法的缓存,则对缓存文件的合法性进行校验。如果通过校验则直接加载如内存直接执行二进制代码;如果校验存在问题,则使用即时编译器进行重新编译,将结果保存会缓存,同时直接执行二进制代码。如果在缓存中不存在该方法的记录,则仍然采用解释进行的方式进行执行,同时进行调用计数,当计数器超过一定的阈值之后,调用即时编译器进行方法的编译,并且根据前文描述的缓存文件的组织和布局方式对该方法的二进行代码进行缓存。本发明的有益效果是I)本发明设计实现了一种针对Java即时编译器动态生成的位置无关代码的缓存与复用管理方法,其轻量级特性和较小的开销使其可在运行时使用。2)本发明设计了轻量级的缓存文件的构造组织法,借助现有Java类与方法的标识信息和文件系统函数接口,可高效地管理缓存代码,并能为缓存检测、维护与加载复用提供很好支持;该方法可用于其他基于文件的管理应用领域。3)本发明设计了基于状态的缓存文件检测方法,可以高效地检测缓存文件的存在性;状态标志分离了检测与加载过程,使加载器复用时机更灵活。4)本发明设计了代码复用的即时加载策略,使虚拟机用较小的开销实现了对位置无关代码的正确复用。


图I为本发明所设计代码缓存文件内容布局。图2为本发明所设计缓存文件组织方式。图3为本发明的代码缓存操作流程。图4为本发明所设计缓存状态变换条件与规则。图5为本发明的代码加载复用操作流程。
图6为本发明的缓存文件检测算法。
具体实施例方式本发明的具体实施过程分两个步骤进行缓存位置无关代码至文件和从文件复用可执行代码。在实施时,前者主要涉及即时编译器的代码生成和管理,需对动态编译生成的可执行代码在恰当的时候按本发明所设计缓存格式和组织方式进行缓存;后者主要涉及解释器和代码管理器,需在恰当的时候按本发明所设计缓存文件检测方法和复用策略对缓存代码进行加载。下面从两个步骤分别细述
步骤一、缓存位置无关代码
首先,虚拟机需要计算位置无关的校验和与元数据中各个大小信息;然后,用构造命名法创建缓存文件和目录(如果不存在对应类文件的目录);最后,以二进制形式将准备好的元数据与原始代码一起写入新建的缓存文件中。本发明中,这些操作发生在即时编译结束之后,代码安装执行之前,如图4中粗线框所示。步骤二、复用位置无关代码
虚拟机通常希望被缓存的代码被加载得越早越好,从而能使虚拟机越早执行效率更高的二进制代码。即时加载的最早时期是方法第一次被执行的时候。按选择性编译流程,Java方法的首次执行引擎都是解释器。因此,本发明将缓存复用加载过程安排在解释器中进行。由于即时加载之前,必须先检测缓存文件的存在性与合法性,因而实施过程中,本发明将缓存检测过程也安排在解释器中。图5左侧粗线流程展示了该过程。图5中的缓存存在性检测过程由图6伪代码所示算法实现。使用图4所示的状态标志及其转换规则,可以确保缓存文件检测过程只发生一次;而后的检测可直接通过比较缓存状态标志简单地实现。当方法首次被执行时,解释器必须调用dvmCodeCacheCheck检测缓存文件存在与否并依据检测结果更新方法的缓存状态(第6行),最后做出跳转决定(第9行)对于CACHED状态结果,虚拟机将从解释执行切换到加载缓存代码进行本地执行;对于NOCACHE状态结果,虚拟机仍然按照选择性编译的正常过程执行,直到方法变热被编译执行,或者因不够热而在解释中执行至结束。该算法中,dvmCodeCacheCheck用构造命名法和文件系统调用接口函数,完成缓存文件存在性检测过程。
权利要求
1.一种Java虚拟机中位置无关代码缓存与复用方法,其特征在于分为两大部分可执行代码缓存方法与缓存文件复用方法,其中 第一部分,可执行代码的缓存方法,包括缓存文件的布局方式、缓存文件的组织策略和位置无关代码缓存; 所述的缓存文件布局,缓存文件由文件头部和文件内容两部分组成;所述文件头部包括标识该文件类型的魔数,除魔数外剩余文件内容的校验和、该文件的总大小、常量池空间大小、代码区大小以及异常信息表的大小,这些信息用于在加载代码前检查文件的完整性并指导内存分配器为即将加载的代码分配空间;所述文件内容包含代码使用的常量池、可执行代码本身以及异常信息表; 所述的缓存文件组织策略,使用目录管理缓存文件,每一个Java类对应一个目录,该Java类中的所有方法对应为该目录中的一个文件,该文件中保存该Java方法的代码缓存;目录名根据Java类的唯一标识进行命名,文件名根据每个Java方法在类中的索引号进行唯一的标识和识别; 所述位置无关代码缓存,以缓存文件布局及其组织方式为基础,根据Java虚拟机中即时编译器的翻译结果将生成的二进制代码保存到缓存中去;具体过程为在即时编译器生成好位置无关的二进制代码后计算代码的校验和、准备该方法的元信息,然后按照上面所述的缓存文件组织策略和布局存入缓存中; 第二部分,缓存文件的复用方法,分为两阶段缓存文件的存在性检测阶段与缓存文件加载阶段;前者负责检测被调用方法是否存在缓存的代码,并检测代码的合法性;后者负责在合适时机加载缓存文件并执行加载的代码; 所述缓存文件的状态在两个阶段间进行相互通信先检测是否存在代码的缓存版本,并更新检测结果至方法的标志位;然后按所设计的方法的缓存状态变换规则与变换条件进行复用虚拟机启动时,每个方法都被指定为初始状态——UNCHECKED,表示未知存在缓存与否;CACHED,表示该方法已经过缓存检测,且存在可复用的代码缓存版本,缓存加载操作可以在恰当的时机加载该方法的缓存代码;NOCACHE,表示该方法已经被检测过,但目前不存在可复用的代码缓存文件;每一个方法初始都为UNCHECKED状态,在执行到该方法时进行缓存检测,如果没有检测该方法则改变为NOCACHE状态,若缓存文件已存在则改变为CACHED状态,方法的二进制代码在失效或者卸载的时候又会改变为NOCACHE状态。
2.根据权利要求I所述的Java虚拟机中位置无关代码缓存与复用方法,其特征在于在缓存文件存在性检测阶段,采用缓存检测算法(I)从方法的类文件获得类文件的标识信息;(2)用类文件标识信息和方法在类文件中方法表里的索引构造出缓存文件的全路径;(3)根据该缓存文件的全路径,使用文件系统库函数,检测所指向的文件是否存在,并依据返回的检测结果更新方法的缓存状态标志。
3.根据权利要求2所述的Java虚拟机中位置无关代码缓存与复用方法,其特征在于在缓存文件加载阶段,采用方法执行时期MET复用策略,即在方法执行前检查缓存状态,并依据缓存状态确定是否先加载再执行。
4.根据权利要求3所述的Java虚拟机中位置无关代码缓存与复用方法,其特征在于所述缓存文件复用方法的具体过程如下首先采用解释执行的方式进入方法的执行,此时进行缓存文件的检测,如果缓存中存在该方法的缓存,则对缓存文件的合法性进行校验;如果通过校验则直接加载如内存直接执行二进制代码;如果校验存在问题,则使用即时编译器进行重新编译,将结果保存会缓存,同时直接执行二进制代码;如果在缓存中不存在该方法的记录,则仍然采 用解释进行的方式进行执行,同时进行调用计数,当计数器超过一定的阈值之后,调用即时编译器进行方法的编译,并且根据前文描述的缓存文件的组织和布局方式对该方法的二进行代码进行缓存。
全文摘要
本发明属于Java虚拟机设计技术领域,具体涉及即时编译器生成的位置无关代码的缓存与复用管理。本发明设计了一种高效的位置无关代码管理方法,并在Android操作系统内置虚拟机Dalvik上将其实现。本发明为位置无关代码设计了良好的缓存文件格式和缓存文件组织方式,并设计了高效的复用检测与加载策略。使用该管理方法可使虚拟机编译器生成的位置无关代码被高效地复用,从而提升虚拟机的执行效率。
文档编号G06F9/44GK102830965SQ201210260280
公开日2012年12月19日 申请日期2012年7月26日 优先权日2012年7月26日
发明者杨珉, 张源, 周波 申请人:复旦大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1