CN101520733B - 装载类的方法和装置及重组类存档文件方法 - Google Patents
装载类的方法和装置及重组类存档文件方法 Download PDFInfo
- Publication number
- CN101520733B CN101520733B CN200810082608.8A CN200810082608A CN101520733B CN 101520733 B CN101520733 B CN 101520733B CN 200810082608 A CN200810082608 A CN 200810082608A CN 101520733 B CN101520733 B CN 101520733B
- Authority
- CN
- China
- Prior art keywords
- class
- framework
- content
- reduction part
- loading
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
- 238000011068 loading method Methods 0.000 title claims abstract description 109
- 238000000034 method Methods 0.000 title claims abstract description 77
- 230000009467 reduction Effects 0.000 claims description 89
- 238000012795 verification Methods 0.000 claims description 17
- 230000006798 recombination Effects 0.000 claims description 10
- 238000005215 recombination Methods 0.000 claims description 10
- 230000008521 reorganization Effects 0.000 claims description 3
- 238000010200 validation analysis Methods 0.000 claims description 3
- 230000008569 process Effects 0.000 description 18
- 238000005516 engineering process Methods 0.000 description 8
- 238000010586 diagram Methods 0.000 description 7
- 238000012360 testing method Methods 0.000 description 5
- 230000000694 effects Effects 0.000 description 3
- 230000006870 function Effects 0.000 description 3
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000012545 processing Methods 0.000 description 2
- 238000013475 authorization Methods 0.000 description 1
- 230000008878 coupling Effects 0.000 description 1
- 238000010168 coupling process Methods 0.000 description 1
- 238000005859 coupling reaction Methods 0.000 description 1
- 238000011156 evaluation Methods 0.000 description 1
- 238000002474 experimental method Methods 0.000 description 1
- 238000000605 extraction Methods 0.000 description 1
- 239000000446 fuel Substances 0.000 description 1
- 238000005457 optimization Methods 0.000 description 1
- 238000004806 packaging method and process Methods 0.000 description 1
- 238000012856 packing Methods 0.000 description 1
- 238000002407 reforming Methods 0.000 description 1
- 230000001502 supplementing effect Effects 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44521—Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供了一种将类装载至虚拟机的方法、装置以及一种重组类存档文件的方法和装置。将类装载至虚拟机的方法包括:在类装载前,类存档文件被组织过,且组织过后的所述类存档文件包含类缩减部分;在类装载时刻,仅将所述类存档文件的所述类缩减部分装载至虚拟机。通过在装载时首先从组织过的类存档文件中将类缩减部分装载至虚拟机,本发明降低了代码冗佘,减少了装载时间,并减少了占用的存储器资源。
Description
技术领域
本发明通常涉及虚拟机技术,更具体地,本发明涉及一种将类装载至虚拟机的方法和装置以及一种重组类存档文件的方法和装置。
背景技术
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、重组器414以及其他与重组相关的描述。
当然,上述内容主要是以分割组织方法为例进行了说明。而本领域技术人员应当了解,任何将类文件重组而可以形成类缩减部分或者类似的结构的方式,都应该在本发明的保护范围之内。比如作为分割的一种补充,将原始类重整也是一种可选的组织形式。原始类重整是指把类存档文件中原有的类信息转变成多个不同的类文件。这些新生成的类文件包括:框架类和内容类。框架类将包含基本的类信息,类似于分割方法中的框架定义。框架类可以被调整包括更多的代码,类似于分割方法中的类缩减部分。框架类与原始的类名相同,装载时被首先载入虚拟机。而内容类仅包括原始类的具体内容并且与原始类名不同,可以仅是一个,由除框架类以外的代码组成;也可以将除框架类外的代码划分为多个不同的类,划分的粒度与用户想要控制载入的粒度相同。框架类的定义中将包括内容类的引用,以便在载入框架类后经由引用找到未被包含在当前类中的代码。重整过程将在类载入之前完成,同样可以根据用例运行的信息调整上述类文件的内容。
通过本发明提供的重组装置和重组方法,就可以在任何适当的时刻执行类存档文件的重新组织,进一步提供了重新组织类存档文件的灵活性。
图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)或大型机来执行。
虽然已经参考目前考虑到的实施例描述了本发明,但是应该理解本发明不限于所公开的实施例。相反,本发明旨在涵盖所附权利要求的精神和范围之内所包括的各种修改和等同布置。以下权利要求的范围符合最广泛解释,以便包含所有这样的修改及等同结构和功能。
Claims (13)
1.一种将类装载至虚拟机的方法,包括:
在类装载前,类存档文件被组织过,且组织过后的所述类存档文件包含类缩减部分;
在类装载时刻,仅将所述类存档文件的所述类缩减部分装载至虚拟机,
其中所述类缩减部分仅包括以下中任一项:
用于描述类基本信息的框架;或者
将被使用的类中描述类基本信息的框架和所述类中将被使用的描述类具体信息的内容。
2.根据权利要求1所述的方法,进一步包括:
记录运行时的类使用信息;和
根据所述类使用信息来重新组织类存档文件,以使得所述类存档文件包括将在以后装载时刻被装载的类缩减部分。
3.根据权利要求2所述的方法,其中所述类使用信息包括框架或内容的遗漏率、遗漏的框架或内容以及框架或内容的未使用率中的一个或更多,所述遗漏的框架或内容利用具有固定大小的存储空间以先进先出方式来记录,并且其中:
当所述遗漏率超过预定阈值时,将所述框架或内容添加至类缩减部分;
将运行结束时所述存储空间中最后留下的框架或者内容添加至类缩减部分;和
当所述未使用率超过另一预定阈值时将所述框架或内容从类缩减部分中除去。
4.根据权利要求2所述的方法,进一步包括:
记录所述装载时刻的类的装载顺序,和
根据所述装载顺序来排列所述类缩减部分,以使所述类缩减部分的排列与所述装载顺序一致。
5.根据权利要求1至4任一项所述的方法,进一步包括:
在装载类时执行内部验证;
在执行字节码时执行符号引用验证。
6.一种将类装载至虚拟机的装置,包括:
类装载器,其中,在类装载前,类存档文件被组织过,且组织过后的所述类存档文件包含类缩减部分,所述类装载器被配置用于在装载时刻仅将所述类存档文件中的所述类缩减部分装载至虚拟机,
其中所述类缩减部分仅包括以下中任一项:
用于描述类基本信息的框架;或者
将被使用的类中描述类基本信息的框架和所述类中将被使用的描述类具体信息的内容。
7.根据权利要求6所述的装置,进一步包括:
运行记录器,配置用于记录运行时的类使用信息;和
重组器,配置用于根据所述类使用信息来重新组织类存档文件,以使得所述类存档文件包含将在以后装载时刻被装载的类缩减部分。
8.根据权利要求7所述的装置,其中所述类使用信息包括框架或内容的遗漏率、遗漏的框架或内容以及框架或内容的未使用率中的一个或更多,所述遗漏的框架或内容利用具有固定大小的存储空间以先进先出方式来记录,并且所述重组器配置用于以如下方式来重新组织类存档文件:
当所述遗漏率超过预定阈值时,将所述框架或内容添加至类缩减部分;
将运行结束时所述存储空间中最后留下的框架或者内容添加至类缩减部分;和
当所述未使用率超过另一预定阈值时将所述框架或内容从类缩减部分中除去。
9.根据权利要求7所述的装置,进一步包括:
装载跟踪器,配置用于记录所述装载时刻的类的装载顺序,
其中,所述重组器进一步配置用于根据所述装载顺序来排列所述类缩减部分,以使所述类缩减部分的排列与所述装载顺序一致。
10.根据权利要求6至9任一项所述的装置,进一步包括:
安全验证器,配置用于:
在装载类时执行内部验证;和
在执行字节码时执行符号引用验证。
11.一种重组类存档文件的方法,包括:
组织所述类存档文件,以使得组织过后的所述类存档文件包含类缩减部分,并且仅所述类存档文件中的类缩减部分在装载时刻被装载,
所述方法还包括以下中的任一项:
将类分割成描述类基本信息的框架和描述类具体信息的内容,并且使所述类缩减部分仅包括类的框架;
其中所述重新组织根据运行时的类使用信息来执行,并且使所述类缩减部分仅包括将被使用的类中描述类基本信息的框架和所述类中将被使用的描述类具体信息的内容。
12.根据权利要求11所述的方法,可以将上述类存档文件进行原始类重整,将所述类存档文件中原有的类信息转变成多个不同的类文件。
13.根据权利要求11所述的方法,其中描述类具体信息的内容根据装载要求的粒度被分割成一个或多个类存档文件。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN200810082608.8A CN101520733B (zh) | 2008-02-27 | 2008-02-27 | 装载类的方法和装置及重组类存档文件方法 |
US12/393,302 US9477496B2 (en) | 2008-02-27 | 2009-02-26 | Method and apparatus for loading classes and re-organizing class archives |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN200810082608.8A CN101520733B (zh) | 2008-02-27 | 2008-02-27 | 装载类的方法和装置及重组类存档文件方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101520733A CN101520733A (zh) | 2009-09-02 |
CN101520733B true CN101520733B (zh) | 2014-04-16 |
Family
ID=40999493
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN200810082608.8A Expired - Fee Related CN101520733B (zh) | 2008-02-27 | 2008-02-27 | 装载类的方法和装置及重组类存档文件方法 |
Country Status (2)
Country | Link |
---|---|
US (1) | US9477496B2 (zh) |
CN (1) | CN101520733B (zh) |
Families Citing this family (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103176781B (zh) * | 2011-12-22 | 2016-03-16 | 北京东方广视科技股份有限公司 | 一种实现软件产品客户化的方法及设备 |
US9785456B2 (en) * | 2014-04-22 | 2017-10-10 | Oracle International Corporation | Metadata-driven dynamic specialization |
US9250891B1 (en) * | 2014-10-28 | 2016-02-02 | Amazon Technologies, Inc. | Optimized class loading |
CN105278989B (zh) * | 2015-10-12 | 2018-04-06 | 北京顶象技术有限公司 | Apk文件的快速加载方法 |
CN108228168A (zh) * | 2017-12-29 | 2018-06-29 | 安徽方正医疗信息技术有限公司 | 一种撤销、恢复操作的抽象方法 |
US11150915B2 (en) | 2019-09-13 | 2021-10-19 | International Business Machines Corporation | Deferred bytecode class verification in managed runtime environments |
US11403075B2 (en) | 2019-11-25 | 2022-08-02 | International Business Machines Corporation | Bytecode verification using class relationship caching |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1591334A (zh) * | 2003-09-05 | 2005-03-09 | 英业达股份有限公司 | 嵌入式系统程序精简处理方法及系统 |
EP1515232A1 (en) * | 2002-06-18 | 2005-03-16 | Matsushita Electric Industrial Co., Ltd. | Program execution terminal device, program execution method, and program |
CN1801093A (zh) * | 2006-01-17 | 2006-07-12 | 浙江大学 | Java操作系统中类装载的实现方法 |
Family Cites Families (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
DE69714752C5 (de) * | 1996-10-25 | 2015-08-13 | Gemalto Sa | Verwendung einer hohen programmiersprache in einem mikrokontroller |
US5923878A (en) * | 1996-11-13 | 1999-07-13 | Sun Microsystems, Inc. | System, method and apparatus of directly executing an architecture-independent binary program |
GB2343021A (en) * | 1998-10-19 | 2000-04-26 | Ibm | Class loading model for object oriented programming |
US6636242B2 (en) * | 1999-08-31 | 2003-10-21 | Accenture Llp | View configurer in a presentation services patterns environment |
US7020874B2 (en) * | 2001-03-26 | 2006-03-28 | Sun Microsystems, Inc. | Techniques for loading class files into virtual machines |
US20040255294A1 (en) * | 2003-02-12 | 2004-12-16 | Bea Systems, Inc. | System and method for hierarchical loading of EJB implementations |
US7533389B2 (en) * | 2003-06-20 | 2009-05-12 | Sun Microsystems, Inc. | Dynamic loading of remote classes |
US7769974B2 (en) * | 2004-09-10 | 2010-08-03 | Microsoft Corporation | Increasing data locality of recently accessed resources |
US7784043B2 (en) * | 2005-09-12 | 2010-08-24 | Oracle International Corporation | Method and system for automated code-source indexing in Java Virtual Machine environment |
US7647336B2 (en) * | 2006-02-09 | 2010-01-12 | International Business Machines Corporation | Creating a real-time class package to class archive file mapping index |
-
2008
- 2008-02-27 CN CN200810082608.8A patent/CN101520733B/zh not_active Expired - Fee Related
-
2009
- 2009-02-26 US US12/393,302 patent/US9477496B2/en not_active Expired - Fee Related
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP1515232A1 (en) * | 2002-06-18 | 2005-03-16 | Matsushita Electric Industrial Co., Ltd. | Program execution terminal device, program execution method, and program |
CN1591334A (zh) * | 2003-09-05 | 2005-03-09 | 英业达股份有限公司 | 嵌入式系统程序精简处理方法及系统 |
CN1801093A (zh) * | 2006-01-17 | 2006-07-12 | 浙江大学 | Java操作系统中类装载的实现方法 |
Also Published As
Publication number | Publication date |
---|---|
US20090217022A1 (en) | 2009-08-27 |
US9477496B2 (en) | 2016-10-25 |
CN101520733A (zh) | 2009-09-02 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101520733B (zh) | 装载类的方法和装置及重组类存档文件方法 | |
CN106156278B (zh) | 一种数据库数据读写方法和装置 | |
CN101601012B (zh) | 具有场景支持的面向生成器图的编程框架 | |
CN109445842A (zh) | 规则生成方法、装置、计算机设备和存储介质 | |
CN103077043B (zh) | 一种快速启动及运行Linux的方法 | |
US20040107414A1 (en) | Method, a language and a system for the definition and implementation of software solutions | |
CN103440201A (zh) | 动态污点分析装置及其在文件格式逆向解析中的应用 | |
CN110908707B (zh) | 一种资源打包方法、装置、服务器及存储介质 | |
US8650537B2 (en) | Optimizing an object-oriented program by transforming invocations of synthetic accessor methods | |
CN103067392A (zh) | 一种基于Android终端的安全访问控制方法 | |
CN110908697B (zh) | 一种资源打包方法、装置、服务器及存储介质 | |
CN101706725A (zh) | 一种可重定位程序的加载及调试方法及系统 | |
CN108845839A (zh) | 应用页面加载方法、装置及计算机可读存储介质 | |
CN103744647A (zh) | 一种基于工作流GPD的Java工作流开发系统及其方法 | |
CN111078279B (zh) | 字节码文件的处理方法、装置、设备及存储介质 | |
CN104657258A (zh) | 一种向目标进程内注入Java字节码的方法及装置 | |
CN109976871A (zh) | 智能合约部署方法、装置、电子设备及存储介质 | |
CN107544811A (zh) | IOS平台隐藏dylib文件的方法、存储介质、电子设备及系统 | |
CN102054041A (zh) | 元数据升级方法和系统 | |
CN111880800A (zh) | 应用下载方法与应用下载系统 | |
CN110457345A (zh) | 数据库读取方法、装置及计算机可读存储介质 | |
CN112231409B (zh) | 数据库同步的初始化装载方法、装置、设备和存储介质 | |
CN108153530A (zh) | 字节码的优化方法、装置、存储介质、处理器及终端 | |
CN110347471B (zh) | 层级式显示组件系统、显示组件调用方法和装置 | |
CN104933019A (zh) | 一种列表生成的方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20140416 |