用于减少预装类的脚印的系统和方法技术方案

技术编号:2887883 阅读:228 留言:0更新日期:2012-04-11 18:40
一种减少由运行时引擎为内部数据结构分配的ROM空间的方法和系统。内部数据结构存储应用程序使用的预装类的成员信息。该系统确定类中表示的内部数据结构的类型,识别每类成员的可能值。该系统还确定在值表中存储每个类型的值所需的空间量和索引该表的每个进入所需的位数。该系统确定成员的出现是用一组值表索引和值表表示,还是用传统方式表示。该确定取决于通用变量大小、成员出现次数、每个索引需要的存储器和值表的大小。(*该技术在2019年保护过期,可自由使用*)

【技术实现步骤摘要】

本专利技术主要涉及一种类预装器,尤其涉及一种用于减少预装的Java类在只读存储器中的大小的系统和方法。一个Java程序包括几个小的软件成分,称为类。每个类包括代码和数据,由各个类文件中的信息来定义。每个类文件根据相同的独立于平台的“类文件格式”来组织。参看附图说明图1,示出了类文件格式的方框图,根据该方框图,每个类文件400包括首部信息402、常数存储池404、方法表406和字段表408。首部信息402确认类文件格式、常数存储池的大小、在方法表406中的方法的数目和在字段表408中的字段的数目。常数存储池404是结构表,代表各种串常数、类名、字段名和在类文件结构和其子结构内所参看的其它常数。方法表406包括一个或多个方法结构,其中每个给出了由类显式声明的方法的全部描述和Java代码。字段表408包括一个或多个字段结构,其中每个给出了由类声明的字段的全部描述。字段表408的一个例子现在参看图1B描述。Java程序是在一台包括称为虚拟机(VM)的程序的计算机上执行的,该虚拟机负责执行Java类的代码。习惯上在程序执行中尽可能迟地装载Java程序的类在程序执行中,当第一次引用时,它们根据从网络服务器或从本地文件系统来的命令被装载。VM为不同的成分定位和装载每个类,分析类文件格式,分配内部数据结构,和将其与其它的已装载的类链接。该进程使类中的方法代码容易被VM执行。对于小的和嵌入的系统,类装载需要的设施,诸如网络连接、本地文件系统或其它永久存储器是没有的,希望能够将类预装入只读存储器(ROM)。在美国专利申请序列号No.08/655474(“一种用于在只读存储器中预装类的方法和系统”)中描述了一种预装方案。这里完全地录入,以供参考。在该方法和系统中,在存储器中的代表类、字段和方法VM数据结构是由类预装器离线产生的。然后,预装器输出被链接在包括VM的系统中和放在只读存储器中。这样就不必存储类文件和进行动态类装载。参看图2A,示出了由类预装器产生的VM数据结构1200的更详细的方框图。数据结构1200包括类块1202、多个方法块1204,多个字段块1214和常数存储池1224。类块1202是固定大小的数据结构,可以包括以下信息●类名1230;●指针1232,指向当前类的类块的即时超类;●指针1234,指向方法块1204;●指针1236,指向字段块1214;和●指针1238,指向类的常数存储池。类块数据结构的元素这里被称为类块成员。方法块1204是固定大小的数据结构,代表一种类方法。方法块数据结构的元素这里被称为方法块成员。字段块1214是固定大小的数据结构,代表一种类的实例变量。字段块数据结构的元素这里被称为字段块成员。VM数据结构的每个类型,包括类块1202、方法块1204、字段块1214和常数存储池1224,都具有由对应的数据结构声明定义的格式。例如,单个方法块声明定义了所有方法块1204的格式。数据结构声明也定义了存取器函数(或宏),由VM使用以存取数据结构成员。这些数据结构声明对VM是内部的,不能由类成分使用。现在参看图2B描述现有技术的数据结构声明。参看图2B,示出了数据结构声明1230的描述,其定义了由特定的VM采用的所有数据结构类型的格式。每个声明1230包括一组成员声明1232和用于存取各个成员的存取器函数1234。成员声明1232和存取器函数1234是根据在VM的实施所用的语言的语法,传统地定义的。例如,假定在数据结构声明1230中使用C语言,类属的(genenc)字段数据结构1230.N(图2B中所示)可以被定义为有五个下面的类型的成员和相应的存取器函数的结构T成员名成员类型存取器函数member1mtype1(T)的mem1 T->member1member2mtype2(T)的mem2 T->member2member3mtype3(T)的mem3 T->member3member4mtype4(T)的mem4 T->member4member5mtype5(T)的mem5 T->member5在该例子中,成员类型可以是由相关的计算机语言定义的任何类型,包括用户定义的类型或语言类型,诸如整型、浮点型、字符型或双精度型。存取器函数是由VM使用的宏,以存取字段,而无需直接存取包含该字段的结构。例如,替代采用表达式“T->member1”,以存取结构类型T中的字段1,VM仅需要采用表达式“(T)的mem1”。存取器函数在诸如C的程序语言中是众所周知的,它能够提供复杂的数据结构。用于存储“类元数据”(即,类、方法和字段块1202、1204、1214)的内部数据结构,需要只读存储器中大的固定量的空间。实际上,测量显示这种类元数据常常比类方法本身的字节代码占据更多的空间。这些内部数据结构因而常常不适用于小的资源受限的装置,在这些装置中类预装是想要的和/或必须的。另外,如果内部数据结构被单个修正,以节约存储空间,VM代码将需要被大范围地修改,以便使VM能够正确地存取修正的数据结构。对VM做这样的变化是艰巨的和低效的。因而,需要修正内部数据结构,它比现有技术的数据结构要小,且包括VM需要的所有信息,不需要VM代码的大范围的或艰巨的修正。总的来说,本专利技术是一种减少预装Java类所需的ROM空间的方法和系统。特别地,本专利技术的方法和系统的根据是,在Java VM类被预装的环境中,很可能VM应是一个封闭的系统,具有一组类和类成分,诸如字段和方法。这样的封闭的VM应包括固定数目的内部数据结构,诸如类块、方法块和字段块。另外,这些数据结构的每个成员(例如,方法块或字段块成员)应有已知组的各异值之一。在这一假设及其推论下,本专利技术减少了需要的存储空间,用下面的方法表示内部数据结构1)确定每个数据结构成员的类型的各异值;2)确定每个数据结构成员类型的出现(例如,在方法块中字段块成员类型的每次出现)和每次出现的值;3)确定如果每次出现用数据结构成员类型的值表的索引表示而不是用传统的方式(在通用变量中存储每次出现的值)表示所节省的存储空间;4)如果结果是节省了足够的空间,那么分配包含各异数据结构成员类型值的值表,用合适的值表入口的索引构造该字段块成员类型的每次出现;和5)产生新的源给VM,这样其对修正的结构的存取被自动适应。在一个优选实施例中,如果下面的比较为真,就决定用值表索引和值表来表示数据结构成员类型(#类型的出现次数)×(索引的大小)+(值表的大小)<(#类型的出现次数)×(通用变量的大小)一旦本方法已经确定,对于每个数据结构成员类型,该类型的出现是用值表的索引来表示,还是用存储值的通用变量来表示,那么本方法发出该类型的合适的信息,包括存取器函数,语言声明和初始化值表的源代码。存取器函数是宏,通过它,所有的运行时的对数据结构成员的存取由VM完成。最好是,在发出上述信息之前,本方法确定值表索引、传统的成员表示法和值表的最紧密的安排,相应地产生值表、值表索引,存取器函数和类。本方法在确定是否修正数据结构成员的传统表示法之后,发出存取器函数,声明和其它数据结构信息。结果是,所有发出的数据结构信息与在内部类表示法中的变化一致本文档来自技高网...

【技术保护点】
一种用于减少要加入到运行时的环境中的预装类的存储器脚印(memoryfootprint)的方法,包括以下步骤:确定在一个或多个用于定义多个预装类的类文件中表示的数据结构的类型,每个数据结构类型包括一个或多个成员;确定可以由每个成员采用的各异的值;为至少一个子组成员存储所述的每个值,以减少包括所述的预装类的相应的内部数据结构的大小;产生一组值索引,用于寻址在存储步骤中存储的值;产生存取器函数和成员声明,能够使运行时的环境使用用所存储的值和所述组的值索引表示的所选择的成员。

【技术特征摘要】
...

【专利技术属性】
技术研发人员:川原秀也内蒂姆弗雷斯科
申请(专利权)人:太阳微系统有限公司
类型:发明
国别省市:US[美国]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1