书签 分享 收藏 举报 版权申诉 / 26

装载类的方法和装置及重组类存档文件方法.pdf

  • 上传人:xia****o6
  • 文档编号:965880
  • 上传时间:2018-03-21
  • 格式:PDF
  • 页数:26
  • 大小:1.25MB
  • 摘要
    申请专利号:

    CN200810082608.8

    申请日:

    2008.02.27

    公开号:

    CN101520733A

    公开日:

    2009.09.02

    当前法律状态:

    授权

    有效性:

    有权

    法律详情:

    授权|||实质审查的生效|||公开

    IPC分类号:

    G06F9/445

    主分类号:

    G06F9/445

    申请人:

    国际商业机器公司

    发明人:

    李欣慧; 迟长燕; 肖文鹏

    地址:

    美国纽约阿芒克

    优先权:

    专利代理机构:

    北京市金杜律师事务所

    代理人:

    吴立明

    PDF完整版下载: PDF下载
    内容摘要

    本发明提供了一种将类装载至虚拟机的方法、装置以及一种重组类存档文件的方法和装置。将类装载至虚拟机的方法包括:在类装载前,类存档文件被组织过,且组织过后的所述类存档文件包含类缩减部分;在类装载时刻,仅将所述类存档文件的所述类缩减部分装载至虚拟机。通过在装载时首先从组织过的类存档文件中将类缩减部分装载至虚拟机,本发明降低了代码冗余,减少了装载时间,并减少了占用的存储器资源。

    权利要求书

    1.  一种将类装载至虚拟机的方法,包括:
    在类装载前,类存档文件被组织过,且组织过后的所述类存档文件包含类缩减部分;
    在类装载时刻,仅将所述类存档文件的所述类缩减部分装载至虚拟机。

    2.
      根据权利要求1所述的方法,其中所述类缩减部分仅包括用于描述类基本信息的框架。

    3.
      根据权利要求1所述的方法,进一步包括:
    记录运行时的类使用信息;和
    根据所述类使用信息来重新组织类存档文件,以使得所述类存档文件包括将在以后装载时刻被装载的类缩减部分。

    4.
      根据权利要求1或3所述的方法,其中所述类缩减部分仅包括将被使用的类中描述类基本信息的框架和所述类中将被使用的描述类具体信息的内容。

    5.
      根据权利要求4所述的方法,其中所述类使用信息包括框架或内容的遗漏率、遗漏的框架或内容以及框架或内容的未使用率中的一个或更多,所述遗漏的框架或内容利用具有固定大小的存储空间以先进先出方式来记录,并且其中:
    当所述遗漏率超过预定阈值时,将所述框架或内容添加至类缩减部分;
    将运行结束时所述存储空间中最后留下的框架或者内容添加至类缩减部分;和
    当所述未使用率超过另一预定阈值时将所述框架或内容从类缩减部分中除去。

    6.
      根据权利要求3所述的方法,进一步包括:
    记录所述装载时刻的类的装载顺序,和
    根据所述装载顺序来排列所述类缩减部分,以使所述类缩减部分的排列与所述装载顺序一致。

    7.
      根据权利要求1至6任一项所述的方法,进一步包括:
    在装载类时执行内部验证;
    在执行字节码时执行符号引用验证。

    8.
      一种将类装载至虚拟机的装置,包括:
    类装载器,其中,在类装载前,类存档文件被组织过,且组织过后的所述类存档文件包含类缩减部分,所述类装载器被配置用于在装载时刻仅将所述类存档文件中的所述类缩减部分装载至虚拟机。

    9.
      根据权利要求8所述的装置,其中所述类缩减部分仅包括用于描述类基本信息的框架。

    10.
      根据权利要求8所述的装置,进一步包括:
    运行记录器,配置用于记录运行时的类使用信息;和
    重组器,配置用于根据所述类使用信息来重新组织类存档文件,以使得所述类存档文件包含将在以后装载时刻被装载的类缩减部分。

    11.
      根据权利要求8或10所述的装置,其中所述类缩减部分仅包括将被使用的类中描述类基本信息的框架和所述类中将被使用的描述类具体信息的内容。

    12.
      根据权利要求11所述的装置,其中所述类使用信息包括框架或内容的遗漏率、遗漏的框架或内容以及框架或内容的未使用率中的一个或更多,所述遗漏的框架或内容利用具有固定大小的存储空间以先进先出方式来记录,并且所述重组器配置用于以如下方式来重新组织类存档文件:
    当所述遗漏率超过预定阈值时,将所述框架或内容添加至类缩减部分;
    将运行结束时所述存储空间中最后留下的框架或者内容添加至类缩减部分;和
    当所述未使用率超过另一预定阈值时将所述框架或内容从类缩减部分中除去。

    13.
      根据权利要求10所述的装置,进一步包括:
    装载跟踪器,配置用于记录所述装载时刻的类的装载顺序,
    其中,所述重组器进一步配置用于根据所述装载顺序来排列所述类缩减部分,以使所述类缩减部分的排列与所述装载顺序一致。

    14.
      根据权利要求8至13任一项所述的装置,进一步包括:
    安全验证器,配置用于:
    在装载类时执行内部验证;和
    在执行字节码时执行符号引用验证。

    15.
      一种重组类存档文件的方法,包括:
    组织所述类存档文件,以使得组织过后的所述类存档文件包含类缩减部分,并且仅所述类存档文件中的类缩减部分在装载时刻被装载。

    16.
      根据权利要求15所述的方法,进一步包括将类分割成描述类基本信息的框架和描述类具体信息的内容,并且使所述类缩减部分仅包括类的框架。

    17.
      根据权利要求15所述的方法,其中所述重新组织根据运行时的类使用信息来执行,并且使所述类缩减部分仅包括将被使用的类中描述类基本信息的框架和所述类中将被使用的描述类具体信息的内容。

    18.
      根据权利要求15所述的方法,可以将上述类存档文件进行原始类重整,将所述类存档文件中原有的类信息转变成多个不同的类文件。

    19.
      根据权利要求18所述的方法,其中描述类具体信息的内容根据装载要求的粒度被分割成一个或多个类存档文件。

    说明书

    装载类的方法和装置及重组类存档文件方法
    技术领域
    本发明通常涉及虚拟机技术,更具体地,本发明涉及一种将类装载至虚拟机的方法和装置以及一种重组类存档文件的方法和装置。
    背景技术
    JAVA是一种跨平台的工具,其具有良好的移植性,且与平台无关,因此在各个领域中得以广泛使用。虚拟机是JAVA应用程序的引擎,用于来解释编译过的应用程序,它对于平台无关的特点起到了至关重要的作用。JAVA语言编写的应用程序并非被编译成标准的可执行代码,而是编译成字节码,即一种适合由虚拟机执行的二进制形式,并被打包保存在类存档文件(即jar文件)中。在执行应用程序时,类装载器以类文件形式将JAVA应用程序字节码从类存档文件中装载到运行或者嵌入在应用平台中的虚拟机内。类文件是为JAVA程序定义的二进制文件格式,是能由任意虚拟机来解释的文件,每个类文件代表一个JAVA类或者接口(接口是一种特殊的抽象类)的完整描述。因此只要应用平台上有适当的虚拟机,就可以将JAVA应用程序装载至虚拟机,应用程序就能够在该应用平台上运行。
    在现有技术的类装载过程中,类装载任务首先被委托给默认的根类装载器。根类装载器可以将具体任务分派给各子类装载器,由子类装载器来沿着类路径搜索类存档文件,直至找到类存档文件。接着对找到的类存档文件进行解包,将存档中的所有文件名一一与所需的类名匹配,直到找到完全匹配的类文件。找到后,搜索入口、取出类的字节码,然后将字节码装载到虚拟机中。
    然而,现有技术的类装载过程中存在有若干问题。
    第一个问题是代码冗余。在现有技术的类装载过程中,以类文件作为单位将类装载到虚拟机中,并为所有装载的类创建内部数据结构。而且,在没有进行任何提取和缩减的情况下,将类文件中的所有二进制数据传送存储器中的方法区域。然而在很多情况下,装载至虚拟机中的类的某些部分甚至整个类在装载之后很少使用,甚至根本不使用。这是因为,应用程序通常是针对普通用户而开发的,对于特定用例而言,使用到的很可能仅仅是应用程序中的很少一部分。因此对于特定用例,这将会导致存储器空间使用效率低下。在本说明书中,用例是指在一定的软件环境和硬件环境下,特定用户使用应用程序的一系列活动的集合。
    为了得到目前的代码冗余情况,本发明人利用JAVA性能分析器(Profiler)、JAVA堆分析工具(JHat)以及可用语法分析和词法分析(Antlr)工具对一个标准应用进行了测试,该标准应用包括有众多功能,发明人对其中的主要功能进行测试。为了得到相对稳定的结果,本发明进行了多次测试,并将多次测试的平均值作为测试结果。该结果表明:启动时实际使用到的方法仅占所有装载方法的32.8%左右,启动时实际使用到的字节码仅占所有装载方法的0.13%左右,插件开发时实际使用到的方法仅占所有装载方法的87.2%左右,而插件开发时实际使用到的字节码仅占所有装载方法的1.3%。该实验可以反映出目前的类装载方法存在有非常严重的代码冗余。尤其是在诸如移动设备等存储器资源有限的环境中,这种代码冗余将对程序性能影响更大。
    现有技术的类装载过程中存在的另一问题是类装载时间过长。这一方面是由于所有的类文件都被装载到虚拟机中,而不考虑这些类文件是否将会在以后的运行中是否会被使用。另一方面是因为在类文件装载过程中需要花费大量的时间来搜索适当的类。类装载时间过长使得程序性能受到很大影响。
    在2006年3月28日获得授权的美国专利No.7020874 B2中,公开了一种用于将类文件装载至虚拟机的技术。该技术将类文件装载到计算机系统的存储器部分,然后从存储器部分中选择性地将类文件装载到虚拟机中,并且当需要类文件没有在虚拟机中时,从所述存储器部分中识别并提取出所需类中的所需部件,然后将其装载至虚拟机。该专利中公开的技术在一定程度上降低了代码冗余,也使得类装载时间得到一定的降低。然而,这种方式需要用来装载类文件的专用存储器,所以需要占用珍贵的系统资源,因此存储器使用效率也较低。尤其是在诸如移动设备等存储器资源有限的环境中,程序性能可能也会因此而受到较大影响。
    因此,在类装载技术领域,迫切需要对目前的类装载方式进行改进,以提供更加适当的类装载技术。
    发明内容
    为此,本发明的目的在于提供一种改进的类装载方式。所述类装载方式可以降低代码冗余、降低装载时间,并且可以减少占用的存储器资源。
    根据本发明的一个方面,提供了一种将类装载至虚拟机的方法,包括:在类装载前,类存档文件被组织过,且组织过后的所述类存档文件包含类缩减部分;在类装载时刻,仅将所述类存档文件的所述类缩减部分装载至虚拟机。本发明的方法与现有技术不同,在装载时首先从组织过的类存档文件中将类缩减部分装载至虚拟机,因此可以降低代码冗余和装载时间,并且可以提高存储器的使用效率。
    在一个实施例中,还可以进一步包括:记录运行时的类使用信息;以及根据所述类使用信息来重新组织类存档文件,以使得所述类存档文件包括将在以后装载时刻被装载的类缩减部分。因此,可以优化所述类缩减部分,使得以后的类装载更加有效。
    在另一个实施例中,所述方法还可以进一步包括:记录所述装载时刻的类的装载顺序,和根据所述装载顺序来排列所述类缩减部分,以使所述类缩减部分的排列与所述装载顺序一致。因此,可以进一步优化所述类缩减部分。
    根据本发明的另一方面,提供了一种将类装载至虚拟机的装置。所述装置包括:类装载器,配置用于在装载时刻从组织过的类存档文件中将其中包含的类缩减部分装载至虚拟机。
    在一个实施例中,所述装置进一步包括:运行记录器,配置用于记录运行时的类使用信息;和重组器,配置用于根据所述类使用信息来重新组织类存档文件,以使得所述类存档文件包含将在以后装载时刻被装载的类缩减部分。
    在另一个实施例中,所述装置还进一步包括:装载跟踪器,配置用于记录所述装载时刻的类的装载顺序,其中所述重组器进一步配置用于根据所述装载顺序来排列所述类缩减部分,以使所述类缩减部分的排列与所述装载顺序一致。
    根据本发明的又一方面,提供了一种重组类存档文件的方法,包括:组织所述类存档文件,以使得组织过后的所述类存档文件包含类缩减部分,并且仅所述类存档文件中的类缩减部分在装载时刻被装载。
    根据本发明的再一方面,提供了一种将类装载至虚拟机的装置,包括:类装载器,其中,在类装载前,类存档文件被组织过,且组织过后的所述类存档文件包含类缩减部分,所述类装载器被配置用于在装载时刻仅将所述类存档文件中的所述类缩减部分装载至虚拟机。
    通过本发明,降低代码冗余和装载时间,并且提高存储器的使用效率。
    附图说明
    通过对结合附图所示出的实施方式进行详细说明,本发明的上述以及其他特征将更加明显,本发明附图中,相同的标号表示相同或相似的部件。在附图中,
    图1A示出了根据本发明一个实施例的将类装载至虚拟机的方法的流程图;
    图1B示出了根据本发明的一个实施例的在类装载至虚拟机后,在运行时刻根据执行信息调整类缩减部分内容的流程图。
    图2示出了类文件结构的一个实例;
    图3示出了根据本发明一个实施例的安全验证过程的框图;
    图4示出了示出了根据本发明一个实施例的将类装载至虚拟机的装置的框图;
    图5示出了根据本发明一个实施例的类存档文件重组装置;
    图6示出了可以实现根据本发明的实施例的计算设备的结构方框图。
    具体实施方式
    在下文中,首先将参考附图通过实施例对本发明的将类文件装载至虚拟机的方法和装置进行详细的描述。需要说明的是,由于“接口”是一种特殊的抽象类,因此在本说明书以及权利要求中,当提及术语“类”时,通常也包括“接口”。
    下面,将参考图1至图3通过实施例对本发明的将类装载至虚拟机的方法进行详细的描述。
    参考图1,首先在步骤101将类分割成描述类基本信息的框架和描述类具体信息的内容。分割类旨在降低本发明的类装载的粒度,使类装载的单位更小。
    为了说明类分割,在此首先对类文件结构进行描述。图2示出了类文件结构的一个实例。该实例展示了Java虚拟机规范中定义的标准类文件格式。类文件结构中包含虚拟机所需的与该类或该接口相关的全部信息,并且二进制字节码就是按照该类文件结构中规定的顺序进行存储的。
    图2示出的表格包括项201至项216。其中参数“magic”201是魔术编码,是指定类文件格式的特殊字,值为0xCAFEBABE,则表示这段代码是类文件。“major_version”203和“minor_version”202项分别代表类文件格式的主、辅版本号,指示类文件所遵循的格式。“constant_pool_count”204指示了“constant_pool”205中常量的数量。项“constant_pool”205是一张cp_info结构表,其中包含了常量池中的各元素信息。“constant_pool”中除了各种常量值以外,还包含有对类或接口的名称、类或接口中定义的字段名和描述符、方法名和描述符的符号引用,这些符号引用在虚拟机执行时会被转换成实际的地址。项“access_flags”206是标志掩码,指明该类文件是类还是接口,并指明了其访问权限。参数“this_class”207指向“constant_pool”204表中的“CONSTANT_Class_infor”结构,该结构表示由该类文件定义的类或接口。“super_class”208项指向“constant_pool”中另一个类似的元素,表示该类文件的直接父类或父接口,值为零表示没有父类。参数“interfaces_count”209表示该类或该接口的直接父接口的个数。项“interfaces”210中包含了这些父接口在constant_pool表中的位置。
    另外,“fields”212是一个Field_info结构列表,其中保存了类或者接口中的声明的变量,“fields_count”211是Field_info结构列表的长度。“methods”214是一个method_info结构列表,其中保存了类或者接口中的声明的方法。“methods_count”213是这个method_info结构列表的长度。而“attributes”216是一个“attribute_info”列表,其中保存了一些指向常量池中constant_utf8_info的索引。“attributes_count”215是这个attribute_info结构列表的长度。
    从上面描述可以看出,项201至210是类文件的一些基本信息,诸如识别类文件的魔术编码、主版本号、副版本号、常量池数量、常量池、访问标志等,这些都是类文件必不可少的信息。而项211至216描述了类中定义的具体信息,诸如各个变量、方法、属性及其数量。
    因此,可以根据类文件结构将类分成两部分,项201至210部分以及项211至216部分,其中项201至210作为描述类基本信息的框架,而项211至216作为描述类具体信息的内容。由于对类进行了分割,因此可以建立框架和内容之间的对应关系,以将框架和内容关联起来。对应关系可以通过索引文件来实现。该索引文件可以包含对与每个类的框架关联的内容的引用,诸如该内容的地址信息,以便可以根据框架来容易地找到内容。另外一种可选的对应关系建立的方式是将内容的引用放置在框架中,在运行时可以通过查找已经被载入的框架获得其关联内容的引用,以便根据引用获知内容的地址信息。在代码载入过程中,现有虚拟机的装载器可以通过现有的动态链接技术找到需要的代码,所以这种办法不需要修改现有虚拟机的类装载器。
    需要说明的是,虽然框架包括项201至210,内容仅包括项211至216,但是由于项212、214和216分别是描述字段、方法和属性的信息结构表,其中包含有大量的元素信息,所以其仍然占据了类文件的绝大部分。
    返回至图1,在步骤102,将类文件中的框架提取出来,将程序的所有类的框架作为类缩减部分存储在一个或多个类存档文件中,而将其余部分,即类的内容,存储在另外的一个或多个类存档文件中。
    虽然在图1包括有步骤101和102,但并不是必须的。在一个实施例中,在执行程序之前,已经预先完成了类的分割和类存档文件的组织,在装载类时已经可以得到类缩减部分。因此,在该实施例中,对于装载类可以不包括步骤101和102。
    在另一实施例中,在发布程序之前,开发人员或者提供商已经对类存档文件进行了重新组织,并得到了类缩减部分,该类缩减部分包括将被使用的类中描述类基本信息的框架和所述类中将被使用的描述类具体信息的内容。这样的类缩减部分例如基于以前的类使用信息而得到。因此,在该实施例中,也可以不包括步骤101和102。
    接着,方法进行至步骤103。在步骤103,从已经组织过的类存档文件中将类缩减部分装载至虚拟机。此时的装载没有装载除类缩减部分之外的其余部分,类文件的搜索也只是在包括缩减类部分的一个或多个类存档文件中进行。因此,可以看出,与现有技术的类装方式不同,本发明的方法从组织过的类存档文件中将类缩减部分装载至虚拟机,而不是将所有的类文件都装载至虚拟机,也不是将类文件先装载到存储器部分。因此,与现有技术相比,本发明的类装载装置显著降低了代码冗余以及类装载时间,并且不需使用额外的专用存储器,因此也节省了系统资源。
    在步骤104可以记录类的装载顺序,以提供类装载时的有用信息。可以借助于现有技术中的性能分析技术,诸如JProfiling和二进制代码执行跟踪技术,来记录装载的类及其装载顺序,也可使用任何其他适合的技术来记录。
    此后,方法进行至步骤105,开始程序的运行过程。在运行中,在使用定义(类的框架或者内容)时,首先在步骤106判断所需的定义是否在虚拟机内。如果所需的定义在虚拟机内,则在步骤107从虚拟机中获取所需的定义。如果所需的定义不在虚拟机内,则在步骤108从未装载部分(即除类缩减部分外的其余部分)中装载。在这种情况下,若需要的定义是类的框架,则从未装载的部分中将类的框架装载至虚拟机;若需要的定义是类的内容且该类的框架在虚拟机中,则虚拟机的常量池已经装有框架内容的索引信息从未装载的部分,基于这些索引信息可以查找与该类的框架关联的内容,诸如该内容的地址,以便根据该索引信息来装载所述类的内容;若需要的定义是类的内容,但是类的框架和内容都不在虚拟机中,则搜索包括未装载部分的类存档文件,将该类框架及其所需的内容装载到虚拟机。
    接着在步骤109,记录类使用信息。类使用信息可以包括遗漏的框架或内容以及运行中用到的框架或内容。可以利用现有技术中各种分析工具来实现类使用信息的记录。例如,可以结合使用JHat和Antrl来分析运行时刻从未装载部分中装载类的情况。可以使用Java性能分析器(Jprof)得到运行时刻活动的框架和内容。然后,根据记录的类使用信息得到框架或内容的遗漏率以及框架或内容的未使用率。例如,可以统计若干次程序运行期间类的框架或内容从未装载部分中装载的次数,并计算该装载次数占程序运行次数的百分比,从而得到类的框架或内容的遗漏率。
    同样,根据运行时刻使用到的类的框架或内容,利用代码分析工具得到在运行期间类缩减部分中未使用的类的框架或内容。例如,动态跟踪运行时使用了的框架和内容,然后需要利用这些分析工具得到没有被使用但是被装载的代码。然后,统计若干次程序运行期间类的框架或内容从未被使用的次数,计算该次数占装载次数或者程序运行次数的百分比,从而得到类的框架或内容的未使用率。
    接着在步骤110,判断运行是否结束。如果没有结束程序的运行,则继续执行运行过程。相反,如果用户要求结束程序的运行,则进行至步骤111。
    在步骤111,利用装载时刻记录的装载顺序和运行时刻记录的类使用信息重新组织类存档文件,以向类缩减部分中添加新框架或内容,以及从其中删除经常用不到的框架或内容,以优化类缩减部分,方便以后的程序的类装载。
    当框架或内容的遗漏率超过一个预定的阈值时,可以将该框架或内容添加至类缩减部分。当框架或内容的未使用率超过另一预定的阈值时,则可以将该框架或内容从类缩减部分中删除。
    此外,还可以采用任何其他适合的策略来添加框架或内容。例如,在一个实施例中,采用固定大小的存储空间以先进先出方式来记录遗漏的框架或内容。在运行结束时,将该存储空间中留下的框架或者内容添加至类缩减部分。需要说明的是,除此之外,也可以采用任何其他适当的方式来添加和删除框架或内容,以实现类缩减部分的优化。
    而后,可以将经过优化的类缩减部分打包在一个或多个类存档文件中,而其他部分打包为另外的一个或多个类存档文件,同时可以更新索引文件中的引用信息。在以后的装载时,就可以从包含该已经优化的类缩减部分的类存档文件中装载类缩减部分。
    另外,在打包之前还可以进一步利用在装载时刻记录的装载顺序对类缩减部分进行排序,使得所述类缩减部分的排列与所述装载顺序一致。由于类缩减部分在类文件中的路径与装载顺序一致,因此在装载时刻搜索类信息花费的时间就可以得到显著降低,从而进一步降低了装载时间。
    在图1示出的实施例中,在结束程序之前重新组织类存档文件。但是,类的装载信息以及类使用信息例如可以存储非易失性的介质中,并且可以在其他任何适当的时间根据存储的类装载信息和类使用信息来执行类存档文件的重组。
    从上面的描述可以看出,每次都基于运行时的类使用信息和类装载顺序来重新组织类存档文件,使类缩减部分逐步得到优化。因此在经过一个学习过程之后,对于特定的用例就可以得到一个稳定的类缩减部分。因此,运行时需要装载所需的定义的情况将会很少发生,程序运行的速度也会逐渐加快。
    在另一实施例中,在步骤111组织类存档文件时还可以将类存档文件分成三个部分:包括类缩减部分的一个或多个类存档文件;包括曾使用部分(这些部分被使用过,但是没有达到添加至类缩减部分中的条件)的一个或多个类存档文件;以及包括从未使用过的部分的一个或多个类存档文件。根据该实施例,在所需的定义不在虚拟机中时,就可以首先从包括曾使用部分的类存档文件中查找,在未找到的情况下才到包括未使用部分的类存档文件中查找。因此,这种方法可以进一步减少学习过程期间程序运行装载类的时间,加快程序运行的速度。
    从上面描述还可以看出,由于类缩减部分随着运行时的类使用情况而动态改变,因此本发明的类装载方法具有较好的适应性和可扩展性。
    本发明的类装载方法还具有另一个显著特点,即它仍然保持Java平台的安全体系结构。通常,Java的安全验证需要两个阶段来完成:阶段1和阶段2。阶段1是内部验证,包括字节码完整行验证、类文件格式验证、内部的连贯性验证、类文件长度验证、单个部分结构良好性验证、Java编程语言规定的约束验证以及字节码验证,其中字节码验证旨在验证字节码流对于虚拟机执行是安全的(主要针对类或接口中定义的方法)。阶段2包括符号引用验证,主要验证在给定类中存在引用的字段或引用的方法、引用的字段或方法具有正确的描述符以及方法在运行时能够访问该引用字段或引用方法。
    现有技术都是以类文件为单位来装载类,因此阶段1和阶段2可以在装载了类文件之后立即执行。而本发明的方法与现有技术不同,本发明并非以类文件为单位来装载。图3示意性地示出了根据本发明一个实施例的安全验证过程的框图。由于在装载时刻,仅装载了类缩减部分,因此阶段2的符号引用验证在初始装载时不能执行。如图3所示,在装载类时(此处包括类缩减部分的装载以及随后遗漏的框架或者内容的装载),可以执行阶段1的验证。阶段2的符号引用验证,则可以推迟到执行字节码时执行。具体地,在类装载时,可以对装载的框架执行除字节码验证之外的内部验证,而对装载的内容执行字节码验证。另外,在需要对类进行分割的情况下,完成了类文件分割之后装载类之前也是执行验证的良好时机。
    下面将参考图4来描述本发明的类装载装置。图4示出了根据本发明一个实施例的将类装载至虚拟机的过程的方框图。
    如图所示,类存档文件400和类存档文件402是经过组织的类打包文件,即jar文件。其中类存档文件400包括类缩减部分401,而类存档文件402包括除类缩减部分之外的其余部分。类缩减部分401是类文件中的部分信息的集合。
    在本发明的一个实施例中,类文件被分割成描述类基本信息的框架和描述类具体信息的内容,缩减部分401可以仅仅包括类的框架,其余部分403包括类的框架,诸如在类存档文件从未被组织过时。类缩减部分401可以在执行程序之前组织,也可以在执行程序时在装载类之前组织。
    在本发明的另一实施例中,类缩减部分401可以仅包括将被使用的类中描述类基本信息的框架和所述类中将被使用的描述类具体信息的内容。这样的类缩减部分例如可以基于类使用信息而得到,其余部分403可以包括除了类缩减部分401之外的部分。
    类装载装置410是根据本发明一个优选实施例的将类装载至虚拟机的装置,该装置包括类装载器411。另外,该装置还可以包括装载跟踪器412、运行记录器413以及重组器414。
    类装载器411配置用于在装载时刻从组织过的类存档文件400中将其中包含的类缩减部分401装载至虚拟机。在运行时刻,如果所需的定义不在虚拟机中,类装载器411还可以用于从类存档文件402包含的其余部分403中将所需的定义装载至虚拟机。
    为了进一步优化缩减类,类装载装置410可以进一步采用装载跟踪器412和/或运行记录器413来记录一些有用信息。其中,装载跟踪器412配置用于记录装载时刻的类的装载顺序,以为重组器414提供装载时的有用信息。运行记录器413配置用于记录运行时的类使用信息,例如通过跟踪堆、栈中保存的内容,以提供可供重组器使用的运行时的有用信息。
    重组器414配置用于根据运行记录器413记录的所述类使用信息来重新组织类存档文件,以使得所述类存档文件包含将在以后装载时刻被装载的类缩减部分。类缩减部分可以仅包括将被使用的类中描述类基本信息的框架和所述类中将被使用的描述类具体信息的内容。
    此外,重组器414还可以配置用于根据装载跟踪器412提供的所述装载顺序来排列所述类缩减部分,以使所述类缩减部分的排列与所述装载顺序一致。重组器的组织存档文件的具体策略以及操作可以参考上面关于步骤111的描述。
    虽然,在该实施例中重组器包括在类装载装置内,但是重组器也可以是设置在类装载装置410外部,利用类装载装置410提供的信息来重新组织类存档文件。
    虚拟机420包括有方法区域421、堆422和栈1至n。方法区域421用于保存通过装载器装载至虚拟机的类文件信息。堆422用于保存程序运行时所创建的对象。当创建了一个线程时,就会为该现成分配Java栈,Java栈保存了一个线程调用方法时的状态,包括本地变量、调用方法的参数、返回值、处理的中间变量。
    从上面的描述可以看出,类装载器411与现有技术的类装载器不同,它是从组织过的类存档文件中将类缩减部分装载至虚拟机,而不是将所有的类文件都装载至虚拟机,也不是将类文件先装载到存储器部分。因此,与现有技术相比,本发明的类装载装置显著降低了代码冗余以及类装载时间,并且不需使用额外的专用存储器,因此也节省了存储器空间,从而提高了程序的性能。
    此外,由于运行记录器413能够记录运行时的类使用情况,因此重组器414可以根据运行时的类使用情况来重新组织类存档文件,以便为以后装载提供便利。尤其是对于特定的用例,在经过一段的学习过程之后,可以形成稳定的类缩减部分。此后,在装载时仅仅需要装载该类缩减部分,而在运行时需要装载所需的定义的情况将会很少发生。因此程序运行的速度也会逐渐加快。
    此外,由于装载跟踪器442可以记录装载时刻类的装载顺序,因此重组器可以对类存档文件中的类缩减部分进行排列,使其顺序与类装载顺序一致。因此,类缩减部分在类文件中的路径与装载顺序一致,在装载时刻搜索类信息花费的时间就可以得到显著降低,进而进一步降低了装载时间。
    此外,本发明的类装载装置依然可以保持Java平台的安全体系结构。在本发明的类装载装置中还可以包括安全验证器。该安全验证器负责执行Java平台的安全体系结构要求的验证。该安全验证器可以在装载类时执行内部验证,在执行字节码时执行符号引用验证。具体地,在加载类时,安全验证器可以对装载的框架执行除字节码验证之外的内部验证,而对装载的内容执行字节码验证。此外,在需要分割类的情况下,安全验证器也可以在类分割完成之后开始安全验证。
    接下来将对本发明提供的重组类存档文件的方法和装置进行详细描述。
    根据本发明的一个实施例,重组类存档文件的方法包括:重新组织类存档文件,以使得类存档文件仅包含将在装载时刻被装载的类缩减部分。该方法可以进一步包括将类分割成描述类基本信息的框架和描述类具体信息的内容,并且使所述类存档文件中包含的类缩减部分仅包括类的框架。在另一实施例中,所述重新组织还可以根据运行时的类使用信息来执行,并且使所述类缩减部分仅包括将被使用的类中描述类基本信息的框架和所述类中将被使用的描述类具体信息的内容。重组方法的细节可以参看上面关于步骤111以及其他与重组相关的描述。
    下面将参考图5来描述本发明提供的重组类存档文件的装置。
    图5示出了根据本发明一个实施例的类存档文件重组装置。如图5所示,类存档文件重组装置500包括:重组器501,配置用于重新组织所述类存档文件,以使得所述类存档文件仅包括将在装载时刻被装载的类缩减部分。类存档文件重组装置500还可以进一步包括分割器502,配置用于将类分割成描述类基本信息的框架和描述类具体信息的内容。重组器501重组类存档文件,使得所述类缩减部分仅包括类的框架。在这种情况下,分割器502和重组器501的具体操作的细节,可以参考上面关于步骤101和102的描述。
    在另一实施例中,所述重组器还可以配置用于根据运行时的类使用信息来重新组织类存档文件,并且使所述类缩减部分仅包括将被使用的类中描述类基本信息的框架和所述类中将被使用的描述类具体信息的内容。关于重组装置的描述可以参考上面关于步骤111、重组器114以及其他与重组相关的描述。
    当然,上述内容主要是以分割组织方法为例进行了说明。而本领域技术人员应当了解,任何将类文件重组而可以形成类缩减部分或者类似的结构的方式,都应该在本发明的保护范围之内。比如作为分割的一种补充,将原始类重整也是一种可选的组织形式。原始类重整是指把类存档文件中原有的类信息转变成多个不同的类文件。这些新生成的类文件包括:框架类和内容类.框架类将包含基本的类信息,类似于分割方法中的框架定义。框架类可以被调整包括更多的代码,类似于分割方法中的类缩减部分。框架类与原始的类名相同,装载时被首先载入虚拟机。而内容类仅包括原始类的具体内容并且与原始类名不同,可以仅是一个,由除框架类以外的代码组成;也可以将除框架类外的代码划分为多个不同的类,划分的力度与用户想要控制载入的力度相同。框架类的定义中将包括内容类的引用,以便在载入框架类后经由引用找到未被包含在当前类中的代码。重整过程将在类载入之前完成,同样可以根据用例运行的信息调整上述类文件的内容。
    通过本发明提供的重组装置和重组方法,就可以在任何适当的时刻执行类存档文件的重新组织,进一步提供了重新组织类存档文件的灵活性。
    图6示意性示出了可以实现根据本发明的实施例的计算设备的结构方框图。
    图6中所示的计算机系统包括CPU(中央处理单元)601、RAM(随机存取存储器)602、ROM(只读存储器)603、系统总线604,硬盘控制器605、键盘控制器606、串行接口控制器607、并行接口控制器608、显示器控制器609、硬盘610、键盘611、串行外部设备612、并行外部设备613和显示器614。在这些部件中,与系统总线604相连的有CPU 601、RAM 602、ROM 603、硬盘控制器605、键盘控制器606,串行接口控制器607,并行接口控制器608和显示器控制器609。硬盘610与硬盘控制器605相连,键盘611与键盘控制器606相连,串行外部设备612与串行接口控制器607相连,并行外部设备613与并行接口控制器608相连,以及显示器614与显示器控制器609相连。另外需要指出的是,本发明不但可以在个人计算机中实现,而且还应用于手持设备,如Palm PC、PDA(个人数据助理)、移动电话等等。
    本发明可以在软件、硬件、或软件和硬件的结合中实现。硬件部分可以利用专用逻辑来实现;软件部分可以存储在存储器中,由适当的指令执行系统,例如微处理器、个人计算机(PC)或大型机来执行。
    虽然已经参考目前考虑到的实施例描述了本发明,但是应该理解本发明不限于所公开的实施例。相反,本发明旨在涵盖所附权利要求的精神和范围之内所包括的各种修改和等同布置。以下权利要求的范围符合最广泛解释,以便包含所有这样的修改及等同结构和功能。

    关 键  词:
    装载 方法 装置 重组 存档 文件
      专利查询网所有文档均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    0条评论

    还可以输入200字符

    暂无评论,赶快抢占沙发吧。

    关于本文
    本文标题:装载类的方法和装置及重组类存档文件方法.pdf
    链接地址:https://www.zhuanlichaxun.net/p-965880.html
    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2017-2018 zhuanlichaxun.net网站版权所有
    经营许可证编号:粤ICP备2021068784号-1