用于面向对象的程序的基于区域的存储器管理的制作方法

文档序号:6446166阅读:141来源:国知局

专利名称::用于面向对象的程序的基于区域的存储器管理的制作方法
技术领域
:本申请通常涉及面向对象的程序的存储器管理。
背景技术
:各种编程语言,如ML,C#和Java,是以由编程者控制存储器的分配,但由运行时机制自动运行解除分配的方式构成的。大部分的这种运行时系统利用无用信息收集程序,此种收集程序可在执行中跟踪对象引用,以便找到不再需要的对象,并解除分配有和再使用它们的存储器。然而,大部分无用信息收集系统都会因故障而受困扰。其中主要是引入了运行时执行成本和在对象存储器可以被回收时和当无用信息收集程序找到对象时之间的间隔时间。作为替代,一些系统利用了基于区域的存储器管理系统。在基于区域的方案中,为将要放入存储器中的对象而在存储器中分配区域,并且存储器的解除分配是相对于整个区域而不是相对于对象层次发生的。基于区域的存储器管理通过减少运行时环境必须保持跟踪和合并释放的存储器的存储器分配数量可减少开支,,存储器分配的解除可以由无用信息收集程序以逐个的方式下进行。区域利用的一个例子是依据调用一种方法,此方法可为其执行建立数据结构,但在返回时就删除了那些数据结构。在这种状况下,当调用本方法时,通过本方法建立了运用的每个区域,然后当本方法返回时就删除了每个区域。因为区域的数量通常都小于分配的对象的数量,运用基于区域的存储器管理的时间运行系统只需要记录区域内对象的引用数量,当引用数达到零时,这允许时间运行系统立即在区域内解除分配。这就避免了有关无用信息收集的恒定检索和减少存储器回收的延迟时间。然而,传统的基于存储器管理系统会增加本身的额外费用。当对区域进行分配或解除分配时,许多现有的系统在编译时就精确确定了。为了便于这种静态确定的存储器管理,一些系统强制将区域分配和解除分配为后进先出(或堆)模型。然而通过严格限定顺序,依照这种顺序可解除分配区域,这种系统可有效的减少存储器分配。在其他现有系统中,没有设定分配顺序,但产生了额外费用,这是因为系统要求传递给方法的对象要与包含可在该方法中使用的任何区域一起被传递。其中之一,Regjava,一种由Christiansen和Velschow扩充的Java语言,要求当对象被传递给方法时知道对象类型的每个子类,并加以注释。这样做,是为了确保在编译时每个由传递的对象所引用的区域能够被有效地传递给所调用的方法。因为每一小类常常包括它们的母集合不包括的区域,这种措施使得许多区域能够被给定母集合的对象引用。这可能使作为程序参数传递的区域的数量较大。这个附加变元传递可能超过可利用的寄存器的数量,增加运行期间的成本,这样就可能减少或删除由基于区域系统提供的效率。这就需要可动态发现包括被引用对象的区域的系统。
发明内容描述了一种利用形状图的基于区域的存储器管理系统。在一个实施例中,描述了一种存储器管理系统,它将存储器划分成多个区域,并利用一个或多个形状图,使得如果给定一对象,可找到包括该对象的区域。在另一个实施例中,描述了一种用于编译基于区域的存储器管理系统的面向对象的程序的方法。该方法接收源代码,然后在代码上执行指向分析(points-toanalysis),从而创建一个或多个形状图。该方法将添加探测以便在产生被执行代码前,利用形状图用于对象创建和区域删除。在又一实施例中,描述了一种包含指令的计算机可读介质,这些指令促使计算机编译用于基于区域的存储器管理系统的程序。这些指令可促使计算机接收源代码、在代码上执行指向分析,从而创建一个或多个形状图,并添加探测,以便在产生执行代码前利用形状图用于对象创建和区域删除。根据以下参照附图对实施例的详尽描述可清楚本发明的其它特征和优点。图1是示出利用形状图的基于区域存储器管理系统的一个实施的结构图。图2是在利用形状图的基于区域存储器管理环境的典型的执行程序的计算机的结构图。图3是示出用于基于区域存储器、利用形状图产生和执行面向对象的程序的过程的流程图。图4是示出用于基于区域存储器管理、利用形状图,产生面向对象程序的附加过程的流程图。图5是示出用于基于区域存储器管理、利用形状图,产生面向对象程序的附加过程的流程图。图6是示出用于基于区域存储器管理、利用形状图,产生面向对象程序的附加过程的流程图。图7a和图7b是示出在基于一般形状图的存储器区域的对象的典型存储的结构图。图8是示出用于基于区域存储器管理、利用形状图,向面向对象的程序添加探测的过程的流程图。图9是用于完成图1的基于区域存储器管理系统的适合的计算环境的结构图。具体实施例方式以下描述将导向用于利用形状图、基于区域存储器管理的技术和系统。该系统和技术允许在编译时产生一个或多个用于面向对象程序的形状图。这些图提供描述用于区域产生和在区域内对象分配的模板元数据。形状图与使程序能够分析这些形状图并使用形状图将对象放入区域中,以及使生成并访问区域的探测一起包括在编译程序中。与参考计数解除分配模式相组合,它可以比现有技术中更少的参数传递和利用限制来产生存储器区域的更加有效利用。基于区域存储器系统也可与无用信息收集程序组合,从而增加存储器解除分配的效率。1.示出的具体实施例图1示出了利用形状图的基于区域存储器管理系统的执行过程。示出的是实施例说明了可接收用于在编辑程序160中的编辑的面向对象程序代码150的编辑器100。在替代实施过程中,面向对象程序代码可包括Java源代码,C#源代码,ML源代码,或其他。另外,当示出的实施例描述单块的程序代码的编译时,在另一个实施过程中,将会利用包括许多分散块代码或数据库的代码。通过包括多个区域的存储器140的执行计算机130,可运行包括执行代码165和一个或多个形状图170的编译程序160。在示出的实施例中,编辑器100,除了传统的编译部件(没有图示),包括在执行计算机130中的利用基于区域存储器管理的两个模块。其一为形状图生成器110,包括可分析面向对象的代码150,从而产生至少一种形状图170的的软件,为了便于在基于区域的系统中的最后的执行,该软件存储在已编译的程序160中。另一个示出编辑器100的模块是存储器管理代码生成器120。在一个实施例中,这个模块包括软件,此软件可分析面向对象的程序代码150和将附加的探测插入到编译程序160的可执行代码165中,从而利用基于区域的存储器管理活动,如区域和对象分配,区域间的关联,区域的定位。在一个执行过程中,形状图生成器和存储器管理探测生成器不包括单独的软件模块,而将其与编辑器100合并。在一个执行中,存储器管理代码生成器120直接向面向对象的程序代码150增加代码;在另一个执行过程中,在可执行前,生成器120直接向已编译的程序160的可执行代码165中插入机器或字节码。2.包括形状图的基于区域存储器管理的实例图2示出了说明利用基于区域存储器140的典型仿计算机130的结构图。在示出的实施例中,存储器包括三个区域210,每个区域都包括不同的对象230。如图2所示,包括在基于区域存储器系统的对象可能包括相关的其他对象,如与对象230相连的细箭头所示。例如,图2区域α中的对象C既包括相关的区域β中的对象D又包括相关的区域ε中的对象E。另外,对象A也包括相关的对象D,同时对象B也包括相关的对象F。在一个执行过程中,这些相关对象包括包含字段的对象A,B和C。换句话说,相关对象也可保存在局部程序和可变函数中。为了简化起见,其中被使用的术语“字段”通常涉及任何相关对象,包括全局的和局部可变量,不仅仅包括对象类别描述的字段。图2也说明了在区域210间的联系,用粗箭头240所示。在示出的实例中,这些表示在包括在区域中的对象间的相关的存在。这样,因为区域α中的对象包括相关的区域ε中的对象,所以两个区域就支持一种联系。在优选实施例中,作为单独实体,这些联系没有真正被保存在计算机130,但被保存在一个或多个形状图中,这些形状图与区域被保存从而允许计算机130定位对象和产生区域关联。所以,在例子中,形状图250与区域α被保存,表明区域α具有在其他两个所示区域中包括的对象。当所示的例子证明保存一个与区域α相关的形状图250时,多个形状图的替代实施过程可能被保存。当在示出例的区域250与区域α被保存时,在另一个执行过程中的形状图从存储器区域210单独的被保存。换句话说,描述所有可能区域间的关联的全局的形状图可能被保留。形状图250包括元数据,这些元数据通过包含表示区域的节点和节点之间的、表明区域之间的关联的直边来保持基于对象引用的区域之间的关联。在一个实施中,形状图边为引用名称。例如,形状图250可以包含这样的信息,即通过包含由“age”边连接的α和β区域,由区域α中的对象的字段“age”引用的任何对象将被包含在区域β中。在替代实施中,形状图可以不同的或附加的信息或通过利用唯一的字段标识符来关联区域,诸如对象类型、引用的保护等级。在一个实施中,将形状图作为描述节点和边的数据结构来保持。在替代实施中,可以使用不同的数据结构,只要这些数据结构包括保持有区域之间的关联的元数据。在一个实施例中,在执行程序期间,根据形状图170中的信息分配区域并将它们彼此相关联。这是通过使用用于创建运行时区域及关联的模板。在一个实施中,当第一次使用这些区域时,在执行期间创建区域。在另一个方案中,当创建一个区域时,如果区域是在形状图的可达子集中描述的,那么子集中所表示的其他所有的区域同样被建立。图2还说明了一种在执行程序260中运行的运行时形状图处理器模块270,该模块可以分析形状图250,从而确定区域关联并正确地分配对象,以及提供区域分配和区域的分配解除。例如,如果在计算机130上执行程序期间的特定点上还没有创建对象D,那么形状图处理器模块270将能够建立存储器区域β并且在要建立对象时在其内分配对象D。在例证性具体实施例中,形状图处理器270包括执行程序260中的不连续模块。在另一个实施中,不存在独立的运行时环境,并且在编译时将形状图处理器的功能包括在经过编译的程序160中。在另一实施中,形状图处理器被合并到其中运行执行程序的运行时环境中。3、形状图的创建在一个具体实施例中,图3示出一种使用应用形状图的基于区域的存储器管理创建程序的过程。在另一个实施中,可以修改图3所示的过程可以不同的顺序执行块,可以组合块,或者将块分成子块。该过程开始于块310,其中分析程序代码150以创建一个或多个形状图170。参考图4、5和6来详细地描述创建形状图的过程。图3的过程进行到块320,其中由存储器管理代码生成器120将探测(instrumentation)添加到面向对象的程序代码150中,以便在运行时使用形状图。接着,在块330,从已修改过的面向对象的程序代码150中生成可执行代码。最后,在块340,将在块310的过程中生成的形状图170和在块330的过程中生成的可执行代码165结合,以便生成完整的已编译程序160。图4示出由创建形状图的形状图生成器110执行的图3中块310的过程的一个实例。在另一个实施中,可以修改图4所示的过程;可以不同的顺序执行块,并且可以组合块,或者将块分成子块。在一个具体实施例中,图4的过程是由ErikRuf在“Java的有效同步去除”(2000)(“Ruf”)中描述的用于分析定位同步的上下文相关点的修订版本,在此以引用的方式将其包含在本文中。在替代实施中可以应用不同的形状图创建过程,这些过程可以是上下文相关或者可以是上下文不相关。虽然下面描述的过程使用了术语“方法”,但是应认识到过程将应用于使用其他术语-诸如“操作”的编程语言。在另一个具体实施例中,使用分析算法的点,其类似于Steensgaard的美国专利号为6014518的专利中描述的“结束多态型推理程序分析”(Steensgaard),在此以引用的方式将其包含在本文中。该过程开始于块410,其中分析程序以便计算静态调用图,对于每个方法而言,其指示由该方法调用的方法。随后的块与假名组(aliassets)建立和操作有关,根据该假名组生成形状图节点和边。如Ruf所描述的那样,假名组是一种用于与从字段名到其他假名组的映射一起表示一组对象引用的数据结构,。在一个实施中,当在程序代码150中使用字段名时,从假名组表示的对象的字段中调用字段名。除了存储从字段到其他假名组的映射之外,假名组还支持结合现有假名组的联合操作,如由Ruf所详细描述的那样。联合操作是根据包含在程序代码150种的语句来执行的。在分析一个面向对象的程序期间,图4的过程将使用假名组生成和联合来产生一起表示程序中的对象引用的假名组。在分析完面向对象的程序后,图4的过程将具有已生成的一起表示程序中的每个对象引用的假名组。通过从假名组和由假名组的映射所定义的连接边中生成形状图节点,从而生成形状图。在不同的实施中,可以各种数据结构保持形状图,只要能够保持形状图的有向图属性。虽然,Ruf在“Java的有效同步去除”中描述了假名组的一个形式使用和构成,但是Ruf所描述的假名组包含附加数据,该数据对于形状图的创建并不是必要的。因此,在一个实施中,假名组只包括字段映射和指示与假名组有关的对象引用中的一个是否可从全局变量到达的标记。例如,引用具有字段“name”和“age”的对象的假名组可以包括<<name→α1,age→α2>,no>,其中α1和α2分别为表示由对象的“name”和“age”字段引用的其他的假名组,并且“no”表示从全局变量不能到达该变量。在一个实施中,虽然为了创建形状图的目的而保持全局可达性信息,但是对于执行来说是不必要的。因此,在一个实施中,在最终创建形状图之前,可以消除可达性信息。进行到块420,为面向对象的程序代码中的每个对象引用计算假名组。由于Ruf所描述的假名组起初是用空字段映射来生成的,所以在块420中为每个字段生成的假名组将被生成为空。过程进行到块430,其中在块410生成的静态调用图被分成一组要被独立分析的牢固连接的部件,该过程使得形状图生成器模块110能够以较小的段来分析程序代码150,并且能够忽略在牢固连接的部件中没有引用的方法和字段,从而提高了分析的效果。在另一个实施中,不将调用图分成牢固连接的部件。此外,在块430,顺序放置牢固连接的部件。尽管在其他实施中也可以利用其他的顺序,但是在优选实施中,是以从下往上的拓扑顺序进行的。接着,在块440,分析第一牢固连接的部件,以便根据程序代码150中的段来生成并统一假名组。该分析过程将在下面参考图5和图6来详细描述。在分析完第一牢固连接的部件之后,过程进行到块460,其中形状图110确定是否存在牢固连接的部件。如果有,则过程继续到块450,其中将分析下一个牢固连接的部件,并且重复该过程。如果不存在,则过程进行到块470,其中已通过在块440和块450的分析而被修改和充实的假名组被转换为形状图。在一个实施中,在创建形状图之前,消除包含在假名组中的、有关全局可达性的信息。然后结束过程。图5示出由编译器100的形状图生成器110执行的图4中块440和450的过程的另一个实例,该过程用于分析程序代码150的牢固连接的部件(“SCC”)以生成形状图。在另一个实例中,图5所示的过程可以修改;可以不同的顺序执行块,并且可以组合块,或者将块分成子块。该过程开始于块505,其中为分析牢固连接的部件的每个方法生成原始的方法上下文。如Ruf所述,方法上下文是一个构成为<<f0,...,fn>,r,e>的元组,其中每个fi,r和e是相应于由该方法的调用程序接收的形式值和该方法的例处值的假名组。在另一个实施中,可以使用一个以上的例处值,或者可以一个都不用。生成方法上下文以便使得调用方法中生成的假名组能够由为其中调用该方法的上下文所生成的假名组系统地反映,这使得能够进行更完整地和上下文有关的形状图模板分析。接着,依次分析SCC中的每个方法。过程进行到块510,其中第一分析方法中的每个参数变量与来自该方法上下文的它的相应假名组关联。在块515,该过程然后分析第一段以便确定在该段中执行的处理。如Ruf所描述的那样,如果段修改了引用变量,对数值进行了处理,或者调用了方法,那么需要将假名组统一。接着在判断块520,形状图模板生成器110确定是否所分析的段为方法调用。如果是,那么过程继续进行到块525,其中根据特定的方法调用规则执行假名组的统一。下面将参考附图6来详细描述在方法调用的基础上进行的统一假名组的过程。然而,如果在块520确定段不是方法调用,那么过程继续进行到块530,其中根据假名组分析规则统一假名组。例如,如果碰到语句v0=v1.f,其中v0和v1是本地对象引用,而f是字段名,那么将会发生统一。在给出的实例中,规则使与v0关联的假名组和通过f映射到v1的假名组的假名组统一。这个统一的实际效果是使得v0的引用通向与v1的f字段的引用相同的假名组。然后,当在执行期间使用形状图时,由变量v0所涉及的对象和v1的f字段所涉及的对象将被分配在相同的区域中。在Ruf中可以找到分析规则的样表。在不考虑语句类型时,过程然后继续进行到判断块540,其中形状图生成器确定是否在当前所分析的方法中还存在其他语句。如果存在其他语句,那么过程进行到块550,其中分析该方法中的下一语句。如果在该方法中不再有语句,那么过程进行到判断块545,其中形状图生成器确定是否在SCC中还存在其他方法。如果存在,那么过程进行到块555,其中根据该方法的方法上下文关联下一方法中的参数变量。另外,如果在SCC中不再有其他方法,那么图5的过程结束。图6示出由编译器100的形状图生成器110执行的图5中块525的一个实例,其执行由方法调用导致的假名组统一或例示。在一个实施中,要经受图6所示的过程的方法调用不仅包括特定义的类方法而且还包括构造函数方法和析构函数方法。在另一个实例中,可以修改图6所示的过程;可以不同的顺序执行块,可以组合块,或者可将其分解成子块。该过程开始于块610,其中为该方法调用生成现场上下文(sitecontext)。现场上下文采用与方法上下文相同的形式<<f0,...,fn>,r,e>,但不表示从调用者接收的数值或返回调用者的值,fi表示传输到被调用者实际值,而r和e表示由被调用者返回的值。接着,在判断块620,形状图生成器110确定是否递归方法调用。如果不递归调用,那么过程进行到块630,其中生成被调用方法的方法上下文的新实例。在一个实施中,新方法上下文的生成使用与原来的假名组同构的假名组生成方法上下文。在该实施中,在新实例中使用的同构假名组是假名组的最新生成的实例,除非被复制的假名组是从全局变量得到,在这种情况下在新方法上下文实例中使用原始的假名组。接着,在块640,通过将现场上下文的每个假名组和其相应的假名组统一在新的方法上下文实例中,将现场上下文与方法上下文的新实例统一。方法上下文的新实例的生成允许上下文相关的分析。在该统一之后,结束过程。在另一个实施中,通过使用类似于Steensgaard所描述的那种类型的多态型推理的示例过程来实现块630和640所描述的效果。然而,如果递归方法调用,那么在块650,在不需要生成新的方法上下文的情况下将调用现场上下文和被调用方法的现有方法上下文统一。而在一个实施中,递归方法调用的不同处理生成上下文制约,其防止了不得不在整个SCC上进行的、直到到达递归调用的固定点结束的迭代的执行成本。在该统一之后,结束过程。在另一个实施中,通过使用类似于Steensgaard所描述的类型的多态型推理的示例过程来实现块650所描述的效果。4、区域创建和对象分配上的形状图效果的例子图7a和图7b示出了存储在根据公用形状图的区域中的对象的两个实例。在示出的示例中,没有将形状图示为一个独立实体,而是通过所示出的连接区域的边来示出的。从其导出这两个实例的形状图是根据对下列代码的分析生成的publicclassTable{publicObjectOne;privatePairtwo;publicPairTwo{  get{returnthis.two;}  set{this.two=value;}}}publicclassPair{  publicObjectleft;  publicObjectright;  publicPair(){  }  publicPair(Objecta,0bjectb){  this.left=a;  this.right=b;  }}<!--SIPO<DPn="10">--><dpn="d10"/>publicclassTriplePair{publicObjectmiddle;publicTriple(){}publicTriple(Objecta,Objectb,Objectc)base(a,c){  this.middle=b;}}publicclassTest{publicstaticintMain(String[]args){  Tabletable=newTable();  table.One=newPair();  Objectshared=newObject();  if(args.Length>1){  table.Two=newPair(newObject().shared);  }else{  tabte.Two=newTriple(newObject(),shared,newObject());  }}}这两个实例示出了位于依赖于执行程序的区域中的对象的类型和数量之间的差异。这两个可能执行的示例代码是根据变元长度来参数化的。对代码的分析生成包括用于建立五个存储器区域的模板的形状图,如图7a和图7b所示。第一存储器区域一区域700在执行之后将始终包含由本地字段“table”引用的Table对象。第二区域一区域710将始终包含由区域700的“table”的“one”字段引用的Pair对象。然而,区域720可以包含不同类型的对象。形状图将区域720描述为包含由区域700的对象的“two”字段所涉及的对象。但是,作为代码,图7a和图7b示出在执行代码中,对象Pair被分配在720中。之所以这么做,是因为Triple是Pair的子类,以及由区域700中的对象的“two”字段所涉及的图7a的Pair或图7b的Triple结束。因此,如图7a和图7b所示,区域可以包含不同类型的数据。图7a和图7b还示出在一个实施中,分析并不将公共和私人字段之间的差异结合到形状图中。“One”字段是一个公共字段,而“two”字段是一个私人字段,但是由于这两个字段都涉及对象,所以将这个字段都包含在形状图中。如在区域700和710中,从其构成图7a和图7b的形状图将区域730描述为包含由区域720的对象的字段“left”涉及的对象,以及将区域740描述为包含由区域720中的字段“right”涉及的对象。但是,区域740具有依赖于程序执行的不同内容。图7a示出程序变元的长度大于11的程序执行,字段“two”涉及只具有字段“left”和“right”的Pair对象。因此,在区域740中只存在由“right”涉及的单一对象。相反,在图7b中,字段“two”涉及Triple对象,该对象不仅包括Pair的字段“left”和“right”,而且还包括字段“middle”。并且因为提供图7a和7b的模板的形状图提供由字段“middle”和“right”之一涉及的对象应被包含在相同的区域中,因此在图7b中,区域740包含由字段“middle”和“right”涉及的两个对象。在所示实施中,形状图描述了字段“middle”和“right”两者的对象被放在相同区域而不是被放在独立的区域中的情况。在一个实施中,如Ruf对形状图创建的描述那样,这是使用假名组的直接结果。在图7a和图7b的实例中这样的原因是存在主方法中的“shared”引用。在两个可能的程序执行的情况下,可以将“shared”分配给区域720中的Pair对象的字段“right”或区域720中的Triple对象的字段“middle”。如果分配给字段“right”,那么由字段“shared”和“right”引用的对象必须在相同的区域中。类似地,如果分配给字段“middle”,那么由字段“shared”和“middle”引用的对象必须在相同的区域中。然而,为了使对象始终有效,字段“shared”只引用一个区域中的对象。因此,例如,生成形状图之上的代码,其将由字段“middle”和“right”涉及的对象放在相同区域中。5、利用形状图的探测图8描述了由存储器管理代码生成器120在块320执行的、用于添加探测以利用形状图的过程的一个实施。在另一个实施中,可以修改图3所示的过程可以不同顺序执行块,可以组合块,或者可以将块分解为子块。在一个实施中由图8添加的探测可以被作为在前编译的源代码添加,诸如方法调用或内嵌代码。或者,将探测以诸如字节代码或机器码的形式添加到已开始或结束编译的代码上。另外,一些探测的包含物可包括现有程序代码的操纵和转换,而不是只添加新代码。而一个实施是将区域和处理程序的形状图合并到执行程序260的形状图处理器270中,在其他实施中,程序一般被包括到面向对象的程序的代码中。在块810的过程,添加区域创建的探测。在一个实施中,该探测接收全局形状图,并根据所需的指示那个区域来自形状图的指示来分配区域。在另一个实施中,描述区域所需的形状图只有一部分被提供给区域创建犯法。另外,不同的实施可以在执行期间不同次数地创建区域。在一个实施中,所有相应于形状图的可达子集的区域是在相同的时间创建的。在另一个实施中,区域是由程序视需要创建的。在一个实施中,区域创建探测还可以包括连续创建在形状图中牢固连接的区域组的探测。这是非常有用的,因为在一个实施中,使用引用计数器保持对在执行程序期间还使用的区域。如果为牢固连接的组中每个区域保持有独立的计数器,那么在没有引用存在的程序执行期间可以从该组外的任何区域中获得条件,但是因为组的牢固连接的属性,使得引用可仍然存在于组的内部。因此这些区域的引用计数器可永不达0,即使相对于程序的剩余部分而言,该组“死亡”并且不能被该组外的任何对象再次引用。这将使区域人工地存在,而不是被解除分配以及具有返回给系统的它们的存储器。因此,在一个实施中,如果确定形状图将描述牢固连接区域的组,那么添加探测以同时生成所有的区域而不是分离地生成。在另一个实施中,尽管为了避免上述问题,而使用了与引用计数器相关的不同探测,但是牢固连接的区域组不是同时地创建的。在另一个实施中,点到图中的牢固连接的部件被缩小为形状图中的节点,这保证了形状图是一个直接的非循环图。然后,处理进行到块820,其中添加探测以使得程序计数区域引用。在一个实施中,这包括每个区域可用的引用计数的生成。在另一个实施中,将牢固连接的区域组的引用计数变量组合到单一计数,该单一计数只对牢固连接组外的区域的引用计数。牢固连接区域组的单一计数的使用通过忽略该组内的区域之间的引用防止了出现上述问题。或者,可以为在执行期间在每个点牢固连接的连接组的每个子集保持单一计数。当较大的牢固连接组的子集通过运行时期间的引用链接时,可将计数并到单以计数中。除了区域的引用计数之外,在块820,存储器管理代码生成器120还添加将递增和递减引用计数的探测。在一个实施中,在生成引用之间添加代码,以便增加生成引用的区域的引用计数。因此每次为对象生成引用时,该对象的区域的引用计数增加1。在一个递减探测的实施中,由存储器代码生成器120在编译时在代码上执行最后使用的分析,以便确定何时可以递减引用计数。在另一个实施中,用于递减引用计数器的探测还包括解除区域和包含在这些区域内的对象的探测。另外,在上述实施中,从牢固连接的区域组中将引用添加到区域中的对象上,可以使整个组的单一计数递增,或者可以使计数合并。在块830,将对象分配探测添加到程序。在一个实施中,这个探测包括对象分配程序或方法,其获得区域的指示和对象的类型和大小,并且在区域种分配对象。在块840中,添加字段设置探测。在一个实施中,这个探测包括获得现有的两个区域的指示和字段,并且填充通过设置相应于第二区域的字段的边而由形状图提供的模板。当程序认为需要时,这使得在执行过程期间懒惰地生成的区域能够与已存在的区域相关联。这可以通过以下实行设置涉及新对象的字段,以及设置新对象中的字段以引用较旧区域中的对象。在块850中,添加使区域能够被查寻的探测。这可以多种方式来进行。在一个实施中,使用一种使用提供的由区域中的对象使用的区域指示和字段的查寻程序或方法来寻找包含由给定字段引用的对象的区域。在另一个实施中,添加另外的探测以便使得区域能够在特定的情况下被找到,如此可以使用以上块840所描述的字段设置程序。具体地说,这样做是为了样的方法,即获得输入对象并在从包含输入对象的区域可达的区域中生成新对象。当包含新对象的区域只可间接地从包含输入对象的区域到达时,存在这种条件。因此添加允许程序能够在运行时从形状图中识别出包含输入对象的区域,并遍历形状图以找到生成区域时的新对象和建立从包含输入对象的区域到包含新对象的区域的一条路径或多条路径所需的区域边的探测。这种探测并不限于这个特定的例子;根据要求添加探测以遍历形状图并消除到不是直接可用的区域的引用的程序代码的结构,可以出现其他条件。在块850的另一个实施中,添加探测以便在方法执行期间可以找到区域。在另一个实施中,这个探测包括不同的程序,对于给定的对象,其将提供包含对象的区域。这个实施将使得的程序能够使用可用形状图的缩小子集执行,这是因为可从它们内部的对象中直接找到区域。因此不使用附加的参数可将对象传递给方法。然而,因为有必要在运行时存储器中保持对象-区域的关联,因此这个实现可以提供附加的开销。或者,代替保持对每个对象-区域的关联的跟踪,当这些对象被传递给方法时,另一个实施使用形状图以找到包含对象的区域。这是通过以下来实施的添加探测以便当将对象传递给方法时,使用形状图发现对象的区域,并同样传递给方法,以使得能够在方法执行期间正确地保持区域。这类似于由Christiansen和Velschow所描述的技术,其中与每个对象一起传递许多区域。但是因为在所描述的该技术中,每个对象地传递至少一个区域,可以显著地减少Christiansen和Velschow的技术中的潜在开销。另外,只传递包含方法的输入对象的区域防止了将脱离上下文的区域信息包含到方法中,这使得编程者能够研究该方法以便不参考调用其的方法或其调用的方法的情况下检查它。在一个实施中,当实施方法调用时,含有变元对象面积的区域总是与变元对象一起被传递。在另一个实施中,只将区域传递给分析面向对象的代码的方法,该代码被标识为可能将对象分配在变元对象的区域中或可从变元对象的区域到达的区域中。在另一个实施中,同样将区域传递给分析作为可能解除一个或多个变元区域或一个或多个可从变元对象的区域到达的区域的标识的方法。在一个实施中,为所有的方法调用考虑全局保持的形状图。在另一个实施中,将全局形状图的子图与区域相关联,如图2所示,如此在方法调用之前,只有必要部分的形状图被考虑。5、计算环境上述编译器100和执行计算机130(图1)可以在各种计算设备和环境上实现,包括各种形式因素(个人、工作站、服务器、手持式、膝上型、平板或其他移动式)计算机,分布式计算网络和Web服务器,作为几个实例。编译器100和运行时环境260可以硬件电路的形式实现,以及可以编译或在计算机或其他计算环境中执行的运行时软件的形式实现,如图9所示。图9示出了一个适当的计算环境900的一般化例子,其中可实现所描述的技术。由于可以通用或专用计算环境的形式实现本发明,因此计算环境900不用于暗示是对本发明的使用范围或功能的限定。请参考图9,计算环境900包括至少一个处理单元和存储器920。在图9中,最基本的结构930包括在虚线中。处理单元910执行计算机可读指令,并且其可以是实处理器也可以是一个虚拟处理器。在多处理系统中,多处理单元执行计算机可读指令以便提高处理能力。存储器920可以为易失性存储器(例如,寄存器、高速缓冲器、RAM),也可以为非易失性存储器(例如,ROM,EEPROM,闪存等),或者也可以为这两者的组合形式。在一个实施中,存储器920存储实现编译器100或运行时环境260的软件980。计算环境可以具有另外的特征。例如,计算环境900包括存储器940、一个或多个输入装置950、一个或多个输出装置960,以及一个或多个通信连接970。连接机制(未示出)-诸如,总线、控制器或网络连接计算环境900的部件。一般而言,操作系统软件(未示出)为在计算环境900中执行的其它软件提供操作环境,并且协调计算环境900各部件的动作。存储器940可移动也可不移动,并且包括磁盘、磁带或磁带卡,CD-ROM、CD-RW、DVD,或者其他介质,它们用于存储信息并可在计算环境900中被访问。在一个实施中,存储器940存储用于编译和运行时软件的指令。输入装置950(例如,作为设备互连结构100中的控制点运作的装置)可以是触摸输入装置,诸如键盘、鼠标、输入笔或跟踪球,也可以是声音输入装置、将输入提供给计算环境900的其他装置。对于音频而言,输入转置950可以为声卡或能够接收模拟或数字形式的音频输入,或者为CD-ROM读出器,其将音频采样提供给计算环境。输出装置960可以为显示器、打印机、扬声器、CD-write或者是提供计算环境的输出的另一装置。通信连接970使得能够在通信介质上与另一计算实体通信。通信介质传达信息,诸如计算机可读指令、音频/视频或其他介质信息,或者传达调制数据信号中的其他数据。调制数据信号是这样一种具有其的特征组或以信号中编码信息的形式改变的信号。例如,但不限于,通信介质包括使用电子、光、RF、红外线、声或其他载体的有线或无线技术。这里的基于区域的存储器管理技术可以计算机可读介质的一般上下文的形式描述。计算机可读介质可以是任何能够在计算环境中被访问的适当介质。例如,但不限于,对于计算环境900而言,计算机可读介质可以包括存储器920、940、通信介质和以上的组合。这里的技术可以计算机可读指令的一般上下文的形式描述,诸如包括在目标实处理器或虚拟处理器上的计算环境中执行的程序模块中的这些指令。一般而言,程序模块包括执行特定任务或实现特定的抽象数据类型的例行程序、程序、库、对象、类、部件、数据结构等。在各种具体实施例中可以视情况组合或分离程序模块的功能。可以在本地或分布式计算环境中执行程序模块的计算机可读指令。为了表达的目的,详细的描述使用术语像“确定”、“生成”、“分析”以便描述计算环境中的操作。这些术语对于计算机执行的操作而言是高度抽象的,因此不应与人工执行的行为混淆。相应于这些术语的实际计算机的操作随着实施而变化。鉴于存在许多可以应用本发明原理的可能的具体实施例,因此我们要求保护我们的像所有可以落入随后的权利要求的精神和范围内的具体实施例的发明和等价发明。权利要求1.一种为执行中的面向对象的程序管理存储器的系统,其特征在于,所述程序包括多个对象,并且所述系统包括一被划分成多个区域的计算机可读存储器,每一区域包含至少一个对象;以及描述所述区域之间的关系的至少一个区域形状图,所述关系至少部分地基于包含在所述区域中的对象之间的引用;使得如果给定对一目标对象的引用,可通过使用来自所述至少一个区域形状图的信息来标识包含所述目标对象的区域。2.根据权利要求1所述的系统,其特征在于所述至少一个区域形状图包括由边连接的多个节点;每一节点表示存储器中一区域;以及每一边表示一个区域的对象与另一区域的对象之间的一个或多个引用。3.根据权利要求2所述的系统,其特征在于,使用来自所述形状图的信息包括标识存储器中包含具有到所述目标对象的引用的第一区域;标识所述至少一个形状图中表示所标识的第一区域的第一节点;标识从所述第一节点引出的、表示到所述目标对象的引用的边;标识所标识的边所通向的第二节点;以及标识由所述第二节点表示为包含所述目标对象的区域的区域。4.根据权利要求1所述的系统,其特征在于,每一区域都具有一与其相关联的形状图,并且每一形状图都连同与其相关联的区域一起储存。5.根据权利要求1所述的系统,其特征在于,它还包括一存储器管理软件模块,它被配置成为区域确定何时包含在所述区域中的没有一个对象被所述区域外的任何字段引用;以及基于作出这一确定删除所述区域。6.根据权利要求5所述的系统,其特征在于,被配置成确定何时没有一个对象被引用包括被配置成为每一区域保持对包含在所述区域中的对象作出引用的次数的计数;以及在确定一区域的计数为零之后,确定包含在所述区域中的没有一个对象被任何其他字段引用。7.根据权利要求5所述的系统,其特征在于,它还包括一无用信息收集程序。8.根据权利要求1所述的系统,其特征在于,至少一个形状图表示少于区域的总数。9.根据权利要求1所述的系统,其特征在于,对传递给一方法的每一对象,传递给所述方法的区域参数不超过一个。10.一种编译面向对象的程序的方法,其特征在于,所述程序被配置成在采用基于区域的存储器管理的系统中执行,并且所述方法包括接收面向对象的程序的源代码;在所述源代码上执行指向分析,以开发包含所述程序的区域关联元数据的至少一个数据结构;向程序添加探测,所述探测被配置成促使基于所述数据结构中的信息在区域中创建对象;以及促使当确定所述区域中没有一个对象被所述区域外的任何字段引用时删除所述区域中所有的对象;以及编译所述程序。11.根据权利要求10所述的方法,其特征在于,包含区域关联元数据的所述数据结构包括一形状图。12.根据权利要求11所述的方法,其特征在于,执行指向分析包括基于包含在所述面向对象的程序的方法中的语句,生成参数的假名组;基于包含在所述程序的方法中的语句统一所述假名组;创建具有由所述假名组定义的节点和由所述假名组之间的字段映射定义的边的至少一个形状图;以及将所述形状图的节点与可能的存储器区域相关联。13.根据权利要求11所述的方法,其特征在于,所述添加的探测至少部分地包括区域创建代码,它在给定一形状图时创建一区域;对象分配代码,它在给定一区域和对象信息时分配具体区域中的对象;以及区域查寻代码,它在给定一区域和一字段标识符时标识由该字段引用的区域。14.根据权利要求13所述的方法,其特征在于,所述添加的探测还包括字段设置代码,它在给定两个区域以及对引用另一区域中的对象的一个区域中的对象的字段的引用时,将所述形状图设置为通过对应于所述字段的边连接对应于所述两个区域的节点。15.根据权利要求13所述的方法,其特征在于,采用基于区域的存储器管理至少部分地包括为每一区域或区域组保持对包含在该区域或该区域组中的对象作出的引用的次数的计数;以及在确定区域或区域组的计数为零之后,删除所述区域或区域组;以及其中,所述添加的探测还包括递增代码,它在给定一区域或区域组时,递增为该区域或区域组保持的所述计数;以及递减代码,它在给定一区域或区域组时,递减为该区域或区域组保持的所述计数。16.一种包含指令的计算机可读介质,其特征在于,当所述指令被执行时,促使计算机通过执行以下过程编译一面向对象的程序以在采用基于区域的存储器管理的系统中执行接收面向对象的程序的源代码;在所述源代码上执行指向分析,以开发所述程序的至少一个形状图模板;向所述程序添加探测,所述探测被配置成促使基于所述形状图模板在区域中创建对象;以及促使当确定所述区域中没有一个对象被所述区域外的任何对象引用时,删除所述区域中所有的对象;以及编译所述程序。17.根据权利要求16所述的计算机可读介质,其特征在于,执行指向分析包括基于包含在所述面向对象的程序的方法中的语句,创建参数的假名组;基于包含在所述程序的方法中的语句统一所述假名组;用由所述假名组定义的节点和由所述假名组之间的字段映射定义的边创建至少一个形状图;以及将所述形状图的节点与可能的存储器区域相关联。18.根据权利要求16所述的计算机可读介质,其特征在于,所述添加的探测至少部分地包括区域创建代码,它在给定一形状图时创建一区域;对象分配代码,它在给定一区域和对象信息时,分配具体区域中的对象;以及区域查寻代码,它在给定一区域和一字段标识符时,标识由该字段引用的区域。19.根据权利要求18所述的介质,其特征在于,所述添加的探测还包括字段设置代码,它在给定两个区域以及对引用另一区域中的对象的一个区域中的对象的字段的引用,将所述形状图设置为通过对应于所述字段的边连接对应于所述两个区域的节点。20.根据权利要求18所述的介质,其特征在于,采用基于区域的存储器管理至少部分地包括为每一区域或区域组保持对包含在该区域或区域组中的对象作出的引用的次数的计数;以及在确定区域或区域组的计数为零之后,删除所述区域或区域组;以及其中,所述添加的探测还包括递增代码,它在给定一区域或区域组时,递增为该区域或区域组保持的所述计数;以及递减代码,它在给定一区域或区域组时,递减为该区域或区域组保持的所述计数。全文摘要修改一种面向对象的程序以便在特定区域中生成对象,使得存储器的分配解除能够同时相对于整个区域发生。区域之间的内容和关联由一个或多个形状图描述,该形状图是根据对程序代码的分析生成的。当需要将不超过一个的区域传递到每个传递的对象的方法时,由形状图存储的区域关联元数据使得基于区域的存储器管理能够发生。文档编号G06F9/44GK1661559SQ20041010233公开日2005年8月31日申请日期2004年9月23日优先权日2003年9月23日发明者B·斯蒂斯加德,D·J·斯普霍佛申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1