CN1280730C - 不用存储单元收集装置及不用存储单元收集方法 - Google Patents
不用存储单元收集装置及不用存储单元收集方法 Download PDFInfo
- Publication number
- CN1280730C CN1280730C CNB021542465A CN02154246A CN1280730C CN 1280730 C CN1280730 C CN 1280730C CN B021542465 A CNB021542465 A CN B021542465A CN 02154246 A CN02154246 A CN 02154246A CN 1280730 C CN1280730 C CN 1280730C
- Authority
- CN
- China
- Prior art keywords
- target
- generation
- storehouse
- memory area
- directive
- 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
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/0223—User address space allocation, e.g. contiguous or non contiguous base addressing
- G06F12/023—Free address space management
- G06F12/0253—Garbage collection, i.e. reclamation of unreferenced memory
- G06F12/0269—Incremental or concurrent garbage collection, e.g. in real-time systems
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/0223—User address space allocation, e.g. contiguous or non contiguous base addressing
- G06F12/023—Free address space management
- G06F12/0253—Garbage collection, i.e. reclamation of unreferenced memory
- G06F12/0269—Incremental or concurrent garbage collection, e.g. in real-time systems
- G06F12/0276—Generational garbage collection
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y10—TECHNICAL SUBJECTS COVERED BY FORMER USPC
- Y10S—TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y10S707/00—Data processing: database and file management or data structures
- Y10S707/99951—File or database maintenance
- Y10S707/99956—File allocation
- Y10S707/99957—Garbage collection
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Memory System (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
不用存储单元收集装置(100)包括:世代堆栈生成部(20),在开始执行方法的同时生成世代堆栈;世代间目标移动部(80),在根据以前生成的世代堆栈来参照新生成的世代堆栈的目标的情况下,将该目标移动到以前生成的世代堆栈;和世代堆栈释放部(40),在结束方法执行的同时,释放对应于该方法的世代堆栈。
Description
技术领域
本发明涉及一种适用于实时处理的不用存储单元收集技术。
背景技术
不用存储单元收集是操作系统的存储器管理功能之一。这是自动释放程序未使用的存储器区域以增加可利用的存储器区域的算法。例如Java(美国SunMicrosystems公司的商标)事先配备执行该算法的不用存储单元收集功能。
不用存储单元收集机构一旦检测到随着程序的执行而被确保在动态的存储器目标(下面简称为「目标」)处于未被任何地方参照的状态下,释放该目标并变为可再利用状态。将这种释放曾经确保的目标并变为可再利用状态的动作称为回收目标。
这里,所谓目标是指应用程序执行时可动态使用的堆栈区的细分单位。各目标是例如目标指向程序设计语言中对应于所谓目标接口的一个统一的长度可变区域,各目标的内容由作为数据与数据类型组的集合的部分、和包含表示目标是否有效的标记等管理用信息部分构成。另外,数据类型表示对应的数据是例如整数、逻辑值、指示字等哪一个的类别,下面,将指示字型的数据简称为「指示字」。
目标的参照通过其它目标保持指示该目标的指示字来进行,例如,在从目标A参照目标B时,目标A包含指示目标B的指示字来作为内容。
某时刻由应用程序参照的所有目标可从由一个或多个基本指示字组成的指示字,直接或以一个以上目标内的指示字为媒介来进行查寻。基本指示字通过控制机构等应用程序的执行环境,将例如应用程序整体或其一部分设定为单位。因此,不用存储单元收集机构将在某时刻不能从基本指示字中查寻到的目标作为不要的目标,设为回收对象。
下面,简单说明作为现有不用存储单元收集方式的标志和扫描(mark-and-sweep)方式及参考计数方式。
标志和扫描方式如特开平11-232162号公报所示,是在对不能从基本指示字中查寻到的所有目标进行附加标志的处理后,扫描所有目标后回收未附加标志的目标的方式。
参考计数方式是对每个目标将表示从几处参照该目标的计数值存储在目标内的管理用信息部分中,每当参照关系变化时与之对应地增加或减少计数值,在计数值变为0的时刻回收该目标的方式。
除上述方式外,还存在各种不用存储单元收集方式,但任一方式都存在不适合在需要应答性的应用程序中利用的缺点。这是因为不用存储单元收集长时间中断应用程序的执行,且很难预测其中断时间及中断时刻。
需要应答性的应用程序要求在包含不用存储单元收集产生的中断时间在内的规定时间内结束规定处理。
另外,若不用存储单元收集产生的中断时间短到不足以与上述规定时间相比的程度,则可在规定时间内结束规定的处理。但是,实际上因为现有的不用存储单元收集中以从基本指示字中查寻散布在存储器区域整体中的目标的处理或对存储器区域整体进行扫描后回收不用目标的处理等以存储器区域整体为对象的处理为主,所以中断时间变长的时候多,因此,在规定时间内基本不可能结束规定处理。
或者,若在设计应用程序时可预测上述中断时间和时刻,则通过调整构成应用程序的各处理的处理时间,可确保应用程序的应答性。但是,很难预测中断时间及时刻。其理由是,在预测中断时间及时刻时需要能够掌握应用程序执行的各时刻的存储器区域整体的使用状况,但掌握重叠构成应用程序的多个处理执行的结果中的存储器区域整体使用状况是极为困难的。
发明内容
因此,本发明的目的在于提供一种所需应答性的应用程序中也可利用的不用存储单元收集方法及不用存储单元收集装置。
实现该目的的不用存储单元收集装置包含:确保单元,在每次开始执行构成应用程序的方法时确保对应于该方法的方法用存储器区域;管理单元,管理由上述确保单元确保的各方法用存储器区域彼此的确保时期的先后关系;移动单元,在某个方法用存储器区域中记录指示字时,根据上述管理单元中管理的先后关系判断该方法用存储器区域的确保时期是否比记录由该指示字指示的数据的方法用存储器区域的确保时期早,在判断为早时,将该数据移动到记录该指示字的方法用存储器区域;和释放单元,在方法执行结束时,释放对应于该执行结束的方法的方法用存储器区域。
根据这种结构,因为将从旧方法用存储器区域参照的新方法用存储器区域的目标移动到旧方法用存储器区域,所以对于新方法用存储器区域而言,不必掌握是否使用完其中的各目标,可在方法结束时一起释放。因此,由于不需要掌握是否使用完的所需时间,所以释放所需时间短。另外,因为该释放仅进行定型处理,所以释放所需时间总是一定,可根据释放处理的各步骤所需的预测时间总计来预测释放所需的时间。
另外,因为移动对象的目标多数不存在于整个存储器区域中,而存在于较新的方法用存储器区域、即整个存储器区域的局部,所以数量相应减少,移动所需时间变短。另外,移动所需时间与目标合计大小成正比,所以若对一个目标通过参照关系来预定眼前目标的合计大小的上限,则可预测移动所需时间的上限。或若确定各方法用存储器区域的上限,则因为移动的目标存在于比参照源目标所存在的旧方法用存储器区域新的方法用存储器区域中,所以可根据新的各方法用存储器区域的合计大小来预测移动所需的时间上限。
此外,因为从旧的方法用存储器区域到新的方法用存储器区域的目标参照仅在执行特定命令的情况下发生,所以世代间的目标移动的发生频率较少。因此,由于移动使应用程序中断的次数少,作为整体中断的时间也变短。
如上所述,因为不用存储单元收集装置的方法用存储器区域释放和目标移动等主处理的启动时间短,且可预测其时间包括上限,所以也可利用于需要应答性的应用程序中。
本发明还包括:
一种不用存储单元收集装置,应用程序不使用的存储区域释放,所述装置包含:
确保单元,在每次开始执行构成应用程序的方法时确保对应于该方法的方法用存储器区域;
管理单元,管理由上述确保单元确保的各方法用存储器区域彼此的确保时期的先后关系;
移动单元,在某个方法用存储器区域中记录指示字时,根据上述管理单元中管理的先后关系判断该方法用存储器区域的确保时期是否比记录由该指示字指示的数据的方法用存储器区域的确保时期早,在判断为早的情况下,将该数据移动到记录该指示字的方法用存储器区域;和
释放单元,在方法执行结束的情况下,释放对应于该执行结束的方法的方法用存储器区域。
一种不用存储单元收集装置,应用程序不使用的存储区域释放,所述装置包含:
确保单元,在开始执行构成应用程序的方法的情况下,确保方法用存储器区域,记录确保的方法用存储器区域与方法的对应关系及确保的各方法用存储器区域彼此的确保时期的先后关系;
移动单元,在根据位于比该方法用存储器区域先确保的方法用存储器区域中的第二目标指示字所指示的目标来参照位于方法用存储器区域中的第一目标指示字指示的目标的情况下,将上述第一目标指示字移动到确保为上述目的的方法用存储器区域;和
释放单元,在方法执行结束的情况下,释放对应于该方法的方法用存储器区域和哪都未参照的目标。
一种不用存储单元收集方法,应用程序不使用的存储区域释放,所述方法包含:
确保步骤,在每次开始执行构成应用程序的方法时确保对应于该方法的方法用存储器区域;
管理步骤,管理由上述确保步骤确保的各方法用存储器区域彼此的确保时期的先后关系;
移动步骤,在某个方法用存储器区域中记录指示字时,根据上述管理步骤中管理的先后关系判断该方法用存储器区域的确保时期是否比记录由该指示字指示的数据的方法用存储器区域的确保时期早,在判断为早的情况下,将该数据移动到记录该指示字的方法用存储器区域;和
释放步骤,在方法执行结束的情况下,释放对应于该执行结束的方法的方法用存储器区域。
一种不用存储单元收集方法,应用程序不使用的存储区域释放,所述方法包含:
确保步骤,在开始执行构成应用程序的方法的情况下,确保方法用存储器区域,记录确保的方法用存储器区域与方法的对应关系及确保的各方法用存储器区域彼此的确保时期的先后关系;
移动步骤,在根据位于比该方法用存储器区域先确保的方法用存储器区域中的第二目标指示字所指示的目标来参照位于方法用存储器区域中的第一目标指示字指示的目标的情况下,将上述第一目标指示字移动到上述先确保的方法用存储器区域;和
释放步骤,在方法执行结束的情况下,释放对应于该方法的方法用存储器区域和哪都未参照的目标。
通过结合说明本发明一特定实施例的附图,从下面的描述中,本发明的上述和其它目的、优点和特征变得明显。
附图说明
图1是根据本发明实施例1的不用存储单元收集装置100的结构图;
图2(a)是表示不用存储单元收集装置100的动作示意的流程图;
(b)是表示步骤S25的目标移动处理示意的流程图;
图3(a)和(b)是表示生成的世代堆栈中确保的目标移动一实例的图;
图4(a)表示帧的生成处理;
(b)表示世代堆栈生成处理;
(c)表示堆栈存储器的生成处理;
(d)表示世代堆栈的进栈处理;
图5(a)表示帧释放处理;
(b)表示世代堆栈的释放处理;
(c)表示世代堆栈的出栈处理;
(d)表示堆栈存储器的释放处理;
图6(a)表示目标生成处理;
(b)表示现在的世代堆栈取得处理;
图7(a)表示世代间目标移动部80进行的向局部变量的代入处理;
(b)表示世代间目标移动部80进行的向部件变量的代入处理;
图8(a)表示世代间目标移动部80进行的世代间目标移动处理;
(b)表示世代间目标移动部80进行的世代间目标移动转包处理;
图9是根据实施例2的不用存储单元收集装置200的结构图;
图10是表示不用存储单元收集装置200的动作示意的流程图;
图11(a)表示目标生成部72进行的目标生成处理;
(b)表示世代间目标移动转包处理的处理顺序;
(c)表示世代堆栈的清除(スカビンジ)处理的处理顺序;
图12(a)表示世代堆栈的标志处理的处理顺序;
(b)表示到达标记的标志处理顺序;
图13表示世代堆栈的扫描处理的处理顺序;
图14是根据实施例3的不用存储单元收集装置300的结构图;
图15表示世代堆栈清除部903进行的世代堆栈清除处理的处理顺序;
图16是根据实施例4的不用存储单元收集装置400的结构图;
图17表示目标生成部74进行的目标生成处理;
图18(a)表示世代间目标移动部84进行的向局部变量的代入处理;
图18(b)表示世代间目标移动部84进行的向部件变量的代入处理;
图19(a)表示被参照量变更部94进行的被参照量减少处理;
(b)表示被参照量变更部94进行的被参照量增加处理;
图20表示目标释放部95进行的目标释放处理;
图21是不用存储单元收集装置400的动作示意的流程图;
图22(a)表示以实施例8的不用存储单元收集装置中的世代堆栈为中心的存储器结构一例;
(b)表示图22(a)例中的指示字移动后的存储器结构实例;
图23表示实施例7的世代堆栈生成部20进行的世代堆栈生成处理的处理顺序;
图24表示实施例7的世代堆栈释放部40进行的世代堆栈的释放处理。
图25(a)表示实体存储器的生成处理;
(b)表示实体存储器的释放处理;
图26表示实施例7的不用存储单元收集装置中的目标生成部70进行的目标生成处理;
图27表示实施例7的不用存储单元收集装置中的世代间目标移动部80进行的世代间目标移动转包处理;
图28(a)表示以实施例7的不用存储单元收集装置中的世代堆栈为中心的存储器结构一例;
(b)表示图28(a)例中的指示字拷贝后的存储器结构实例;
图29(a)表示释放第三世代堆栈情况下的存储器结构的变化实例;
(b)表示图29(a)例中的目标释放后的存储器结构实例;
图30表示世代堆栈释放部40进行的世代堆栈释放处理的处理顺序;
图31表示实施例8中的不用存储单元收集装置的目标生成部70进行的目标生成处理的处理顺序;
图32表示实施例8的不用存储单元收集装置中的世代间目标移动部80进行的世代间目标移动转包处理;
图33(a)及(b)表示应向实施例1至6的不用存储单元收集装置追加的句柄存储器(handle memory)的生成处理及释放处理;
图34表示实施例1的目标生成部取代图6(a)所进行的目标生成处理。
图35表示实施例1至6的世代堆栈释放部取代图5(b)进行的世代堆栈的释放处理;
图36表示实施例1至4的世代间目标移动部取代图8(b)进行的世代间目标移动转包处理;
图37表示实施例2和3的目标生成部取代图11(a)进行的目标生成处理;
图38表示实施例4的目标生成部取代图17进行的目标生成处理;
图39表示实施例4至6的目标释放部取代图20进行的目标释放处理;
图40表示实施例5和6的目标生成部进行的目标生成处理。
具体实施方式
下面,用附图来说明本发明的实施例。
实施例1
图1表示根据本发明实施例1的不用存储单元收集装置100的功能框图。
不用存储单元收集装置100是一种软件装置,在具备CPU、存储器等的计算机中,通过CPU执行存储器中存储的控制程序来实现,在操作系统上动作,是由Java语言等形成的应用程序执行环境的一部分。
在该图中,不用存储单元收集装置100由帧生成部10、世代堆栈生成部20、帧释放部30、世代堆栈释放部40、世代堆栈管理部50、堆栈存储器管理部60、目标生成部70、及世代间目标移动部80构成。
帧生成部10在每次调用应用程序的方法时在存储器区域内生成帧,堆栈管理生成的帧。
这里,所谓方法是所谓的子程序,例如C++中的函数与之相当。通常,子程序是一个统一的部分程序,从其它部分程序调用后执行,另外,包含在执行后返回调用源的部分程序的命令。帧是这种方法被执行时必需的作业用存储器,保持后述的对世代堆栈的指示字等。
世代堆栈生成部20对应于帧的生成生成世代堆栈。世代堆栈是存储方法执行时必需的局部变量或目标等用的存储器区域。每次生成一个帧,也生成一个世代堆栈,各世代堆栈从生成时期早的时期开始依次上升地附加世代序号后进行识别。
一旦方法执行结束,帧释放部30就释放对应于该方法的调用所生成的帧。
世代堆栈释放部40对应于帧的释放来释放对应于该帧的世代堆栈。
世代堆栈管理部50堆栈管理由世代堆栈生成部20及世代堆栈释放部40生成及释放的世代堆栈。
堆栈存储器管理部60对应于世代堆栈生成部20及堆栈释放部40的世代堆栈的生成及释放,将存储器的一区域用作世代堆栈来进行确保和释放。
目标生成部70对应于应用程序执行时的目标生成,将存储器的一区域确保为目标用。
世代间目标移动部80向各世代堆栈中代入局部变量及目标的部件变量。在代入部件变量时,一旦检测到先生成的世代堆栈(下面称为旧世代堆栈)的目标的部件变量参照位于其后生成的世代堆栈(下面称为新世代堆栈)中的目标时,则进行将该新世代堆栈的目标移动到旧世代堆栈的处理。世代间目标移动部80递归地进行该处理。所谓递归地是指目标移动的结果,在产生从旧世代堆栈向新世代堆栈的新的参照关系的情况下,使新世代堆栈的目标移动到旧世代堆栈,重复该处理,直到不发生从旧世代堆栈到新世代堆栈的参照关系为止。
下面,说明不用存储单元收集装置100的动作示意。
图2(a)是表示不用存储单元收集装置100的动作示意的流程图。
步骤S21:不用存储单元收集装置100接受来自应用程序的各种请求,对应于各种请求,进行步骤S22-S25中之一的处理。
步骤S22:一旦存在应用程序的帧确保请求,则帧生成部10生成帧,世代堆栈生成部20生成对应于该帧的世代堆栈。
步骤S23:一旦存在帧释放请求,则世代堆栈释放部40释放对应于帧的世代堆栈,接着释放帧。
步骤S24:在存在目标确保请求的情况下,目标生成部70在对应于相应帧的世代堆栈内确保目标。
步骤S25:代入目标的指示字若指定存在于新世代堆栈中的目标,则世代间目标移动部80移动目标。
图2(b)是表示步骤S25的目标移动处理示意的流程图。
步骤S26:不用存储单元收集装置100在存在从位于n世代堆栈中的目标到比n世代新的m世代堆栈的目标X的参照的情况下,执行步骤S27的处理。
步骤S27:使目标X从m世代移动到n世代。
步骤S28:返回步骤S26。
在图2(a)中,因为步骤S22、步骤S23和步骤S24的各自处理的处理内容是定型的(参照图4(a)以后的流程图),所以每次的处理时间都不变。因此,若预测各步骤所需时间,并进行合计,则可预测整体的处理时间。另外,因为处理内容单纯,所以处理时间短,整体的处理时间也变短。
尤其是,步骤S23的处理是所谓一次性释放位于世代堆栈内全部目标的处理,所以不需要以前那样通过从存储器中确认每一个目标来发现使用完的目标并释放的耗时操作。能够一次性地释放是因为有步骤S25的处理。因为步骤S25的处理可以没有世代间的参照,所以在帧释放时全部使用完对应的世代堆栈内的目标,可以释放所述各目标,而不需要确认是否已经使用完。
另一方面,处理时间随移动对象的目标数量变化,所以步骤S25的处理不定。但是,作为处理对象不是存储器整体而只限于规定的世代堆栈,所以处理时间较短。另外,因为不是存储器整体而只限于规定的世代堆栈,所以可较易掌握移动对象的目标数量,若能掌握目标的数量,则也可预测与该数量成正比的处理时间。此外,从旧世代堆栈目标到新世代堆栈目标的参照仅在程序中包含特定命令的情况下发生,该特定命令的发生频率少,因此,执行步骤S25的处理次数也少。
从以上所述可知,步骤S22-步骤S25的各处理的处理时间短、可预测、且步骤S25的处理的发生频率少,所以不用存储单元收集装置100可利用于需要应答性的应用程序中。
图3(a)和(b)是表示生成的世代堆栈和世代堆栈中确保的目标移动实例的图。
在说明移动前先说明生成世代堆栈的步骤。
首先,一旦在应用程序执行最初调用第一方法,则生成一个第一方法用作业用帧,与该帧对应地生成图(a)所示的第一世代堆栈。
接着,一旦在第一方法执行中调用第二方法,则生成第二方法用帧,与该帧对应地生成图(a)所示的第二世代堆栈。此时,第二世代堆栈堆栈状地堆积在第一世代堆栈上。另外,一旦在第二方法的执行中调用第三方法,则生成一个第三方法用作业用帧,与该帧对应地生成图(a)所示的第三世代堆栈,堆栈状地堆积在第二世代堆栈上。这里,附加到第一、第二及第三方法的序数可区别方法的调用,而不能区别方法内的命令内容。各方法内的命令内容因应用程序而不同或相同。在该实例中,虽然一个执行中的方法仅调用一次方法,但不限于该实例,一个执行中的方法也可调用两次以上的方法。另外,在图(a)及(b)中,虽然生成的世代堆栈数量为三个,但不限于三个,生成的世代堆栈的数量随应用程序的内容而变。
对于如此生成的世代堆栈,若方法执行中存在应用程序向部件变量的代入处理,则将这些部件变更的值代入对应于执行中方法的世代堆栈的目标内。
位于图3(a)及(b)的各世代堆栈中的目标表示代入部件变量值后的目标。图中,从一个目标延伸到另一目标的箭头线表示指示字。即,箭头线的起点目标表示参照该箭头线的终点的目标。
通过执行应用程序,将部件变量的值代入目标,结果,如图3(a)所示,一旦发生从位于第一世代堆栈的目标A到位于第三世代堆栈目标B的参照(图中由虚线箭头表示),则世代间目标移动部80将目标B移动到第一世代堆栈。结果,目标B与目标C之间的参照关系变为从位于第一世代堆栈的目标B到位于第二世代堆栈的目标C的参照。即,变为从旧世代堆栈到新世代堆栈的参照。从而,世代间目标移动部80将位于第二世代堆栈中的目标C移动到第一世代堆栈。最终,各世代堆栈的内容如图3(b)所示。在图3(b)中,具有指示字的各目标参照同世代的别的目标或参照较旧世代堆栈的目标。
因此,世代间目标移动部80在产生从旧世代堆栈到新世代堆栈的参照关系的同时,将位于新世代堆栈中的目标移动到旧世代堆栈。
下面,表示不用存储单元收集装置100的详细处理步骤。
图4(a)、(b)、(c)及(d)表示方法执行时的处理步骤。
图4(a)表示帧的生成处理的步骤。
帧生成部10一旦通过应用程序调用方法,则执行图4(a)所示的帧生成处理。
步骤S401:帧生成部10准备对应于该方法的世代堆栈地址保持用的变量heap。
步骤S402:帧生成部10生成帧,将帧的地址代入变量frame。
步骤S403:帧生成部10调用图4(b)所示世代堆栈生成处理,在世代堆栈生成部20中生成世代堆栈,结果,取得得到的世代堆栈的地址,作为变量heap。
步骤S404:最后,帧生成部10将变量heap的值存储在步骤S402中生成的帧的对世代的指示字中。
图4(b)表示世代堆栈生成处理的步骤。
步骤S411:世代堆栈生成部20调用执行图4(c)所示的堆栈存储器生成处理,在堆栈存储器区域中确保世代堆栈,将该世代堆栈的地址adr代入变量heap。
步骤S412:世代堆栈生成部20在确保的世代堆栈内分配该世代所需个数的局部变量、进行初始化。
步骤S413:世代堆栈生成部20调用执行图4(d)所示世代堆栈的进栈处理,将世代堆栈堆积成堆栈。
图4(c)表示堆栈存储器的生成处理。
步骤S421:在步骤S411中,若调用堆栈存储器的生成处理,则堆栈存储器管理部60如图4(c)所示在堆栈存储器内确保固定大小的存储器块,将其地址代入adr后返回步骤S411。
图4(d)表示世代堆栈的进栈处理。
步骤S431:世代堆栈管理部50将g代入heap指定的世代堆栈的世代序号中。这里,g为全球变量,设初始值为1,表示下一世代堆栈的世代序号。即,g表示堆积成堆栈的世代堆栈的世代序号。
步骤S432:世代堆栈管理部50将g的值增加1。
步骤S433:接着,将top的值代入世代堆栈的母指示字中。这里,top保持由这次世代堆栈的进栈处理堆积为堆栈的世代堆栈的一个母世代堆栈的指示字,初始值为Null指示字。
步骤S434:最后,世代堆栈管理部50准备下次的世代堆栈的进栈处理,将heap的值代入top中。
图5(a)、(b)、(c)表示方法结束时的处理步骤。
帧释放部30一旦应用程序的方法结束,则进行图5(a)所示的帧释放处理。
步骤S501:帧释放部30调用图5(b)所示的世代堆栈的释放处理,释放对应于释放对象的帧的世代堆栈。
步骤S502:释放释放对象的帧。
图5(b)表示世代堆栈的释放处理。
步骤S511:世代堆栈释放部40调用图5(c)所示世代堆栈的出栈处理,从堆栈中去除对象的世代堆栈,释放世代堆栈。
图5(c)表示世代堆栈的出栈处理的内容。
步骤S521:世代堆栈管理部50首先准备变量work作为世代堆栈的地址存储用。
步骤S522:将保持下一世代序号的变量g的值减1。
步骤S523:将保持在top中的值代入work。
步骤S524:将top指定的世代堆栈的母指示字的值代入top。
步骤S525:最后,调用图5(d)所示的堆栈存储器的释放处理,释放work指定的世代堆栈的存储器块。
图5(d)表示堆栈存储器的释放处理。
步骤S531:堆栈存储器管理部60释放释放对象的存储器块。
图6(a)表示目标生成部70进行的目标生成处理。
步骤S601:目标生成部70准备变量heap,用于确保世代堆栈的地址。
步骤S602:接着,调用图6(b)所示的现在的世代堆栈取得处理,取得对应于现在执行中的方法的世代堆栈的地址。
步骤S603:接着,从位于取得的地址的世代堆栈的空区域中确保目标区域,将目标的地址代入obj。
步骤S604:另外,分配obj指定的目标的部件变量,初始化目标区域。
图6(b)表示现在的世代堆栈取得处理。
步骤S611:世代堆栈管理部50将top的值代入heap中。
图7(a)表示世代间目标移动部80进行的向局部变量的代入处理。
步骤S701:世代间目标移动部80一旦在应用程序的执行过程中发生向局部变量的代入,则将应代入的值val代入地址adr指定的代入目的局部变量中。
图7(b)表示世代间目标移动部80进行的向部件变量的代入处理。
步骤S711:世代间目标移动部80一旦在应用程序的执行过程中发生向部件变量的代入,则将应代入的值val代入地址adr指定的代入目的部件变量中。
步骤S712:接着,判断代入的val是否是对其它目标的指示字。
步骤S713:在是指示字的情况下,调用图8(a)所示的世代间目标移动处理。
图8(a)表示世代间目标移动部80进行的世代间目标移动处理。
步骤S801:世代间目标移动部80初始化存储目标地址用的堆栈stack、存储用于存储目标地址的变量obj1、obj2的世代序号的g1、g2。
步骤S802:将图7(b)中的代入目的目标的地址obj推进stack中。
步骤S803:在stack不空时,从stack中推出地址并代入obj1,重复步骤S803-步骤S811的处理。
步骤S804:将obj1指定的目标、即从stack中推出的地址指定的目标位于的世代堆栈的世代序号代入g1。
步骤S805:通过obj1指定的目标的部件,在存在具有指定其它目标的地址的部件期间,将其地址代入obj2后,重复步骤S805-步骤S810。
步骤S806:将obj2指定的目标位于的世代堆栈的世代序号代入g2。
步骤S807:判断是否g1<g2,即,g2的世代堆栈的世代是否比g1的新,在g1<g2的情况下,前进到步骤S808,在非g1<g2的情况下,前进到步骤S810。
步骤S808:步骤S807的判断结果,在g1<g2的情况下,调用图8(b)所示世代间目标移动转包处理。这里,将obj2的值代入obj1,将obj1指定的目标位于的世代堆栈的地址代入heap。
步骤S809:将obj2推进stack。
步骤S810:返回步骤S805。
步骤S811:返回步骤S803。
图8(b)表示世代间目标移动转包处理。
步骤S812:世代间目标移动部80将obj指定的目标移动到heap指定的世代堆栈。
如上所述,实施例1中的不用存储单元收集装置100在每次方法调用时确保世代堆栈。在方法的执行中,在对应的世代堆栈中生成该方法中必需的目标。当将值代入目标时,若发生从旧世代堆栈目标到新世代堆栈目标的参照,则将新世代堆栈的目标移动到旧世代堆栈。另外,在方法结束的同时,一次性地释放对应的世代堆栈。不用存储单元收集装置通过这种结构可具有如下效果。
(1)各世代堆栈释放所需时间短,并可预测该时间。
第一方法执行中调用的第二方法比第一方法先结束,第一方法在第二方法结束后结束。根据这种关系,由对应于第一方法的旧世代堆栈的目标参照的对应于第二方法的新世代堆栈的目标在第二方法结束后、在第一方法结束前由旧世代堆栈的目标参照的可能性高。另外,未由旧世代堆栈目标参照的新世代堆栈的目的在第二方法结束的同时使用结束。因此,若将根据旧世代堆栈目标参照的新世代堆栈目标移动到旧世代堆栈,则因为新世代堆栈中仅剩余使用完的目标,所以对于新世代堆栈,不必调查各目标是否使用完,在方法结束的同时可进行释放。因此,因为不必调查是否使用完,所以释放所需时间短。
另外,该释放因为仅进行图5(b)、(c)、(d)流程图所示的定型处理,所以释放所需的时间一定,可容易预测时间,通过合计各步骤所需的预测时间,可预测释放所需的时间。
(2)一次世代间目标移动处理所需的时间短,可预测该时间。
作为移动对象的目标不存在于比参照关系发生的旧世代堆栈旧的世代堆栈中,而存在于比旧世代堆栈新的世代堆栈中。因此,移动对象的目标由于存在于整个存储器区域中的局部部分中,所以目标移动所需时间短。
另外,目标移动所需时间与移动的目标的合计大小成正比。从而,若对一个目标通过参照关系预定眼前目标的合计大小的上限,则可预测移动所需时间的上限。或者,若确定各世代堆栈的上限,则移动的目标由于存在于比参照源目标存在的旧世代堆栈新的各世代堆栈中,所以可根据新的各世代堆栈的合计大小来预测移动所需的时间上限。
此外,因为在执行特定命令的情况下不发生从旧世代堆栈的目标到新世代堆栈目标的参照,所以世代间目标移动处理的发生频度较少。从而,由世代间目标移动处理使应用程序执行中断的次数少。
根据上述(1)和(2),不用存储单元收集装置100的世代堆栈释放或目标移动等主处理的启动处理时间短,可预测其时间,包括其上限,所以可用于需要应答性的应用程序中。
实施例2
下面,说明根据本发明实施例2的不用存储单元收集装置。
实施例2的不用存储单元收集装置除实施例1的不用存储单元收集装置100的功能外,还具有在目标生成时或移动时世代堆栈中无空隙,在不能生成或移动目标时,基于标志和扫描方式对该世代堆栈和比其新的世代堆栈进行清除处理的功能。其中,清除处理是回收世代堆栈内使用完的目标并通过释放这些目标来增加空区域的处理。另外,也可使用现有的其它不用存储单元收集算法来取代标志和扫描方式。
图9是根据实施例2的不用存储单元收集装置200的结构图。
在该图中,不用存储单元收集装置200由帧生成部10、世代堆栈生成部20、帧释放部30、世代堆栈释放部40、世代堆栈管理部50、堆栈存储器管理部60、目标生成部72、世代间目标移动部82及世代堆栈清除部90构成。在该图中,与图1相同的标号的结构要素与实施例1的相同,所以省略说明,下面,主要说明不同标号的结构要素。
目标生成部72对应于应用程序中的目标生成,将存储器的一区域确保为目标用。目标生成部72在确保时,在管理用信息部分中设置用于存储到达标记的一比特的区域。到达标记表示是否根据根指示字来直接或间接参照目标。
另外,目标生成部72在确保时,在检测到对象的世代堆栈中没有目标生成用的充足的空区域时,在世代堆栈清除部90执行清除处理,结果,在形成的空区域中确保目标。
世代间目标移动部82进行向局部变量或部件变量的代入,一旦检测到通过该代入发生从旧世代堆栈的目标到新世代堆栈目标的参照时,进行将新世代堆栈的目标移动到旧世代堆栈的处理。此时,一旦检测到移动目的的旧世代堆栈中没有存储移动对象目标的充足区域,则世代堆栈清除部90执行该旧世代堆栈及比其新的世代堆栈的清除处理,结果,在形成的老世代堆栈的空区域中存储移动对象的目标。
一旦目标生成部72及世代间目标移动部82检测出世代堆栈中没有空区域,则世代堆栈清除部90对该世代堆栈进行清除处理。
图10是表示不用存储单元收集装置200的动作示意的流程图。
图10与图2(a)的不同之处在于增加了步骤S101的处理。即,不用存储单元收集装置200当在步骤S24中要生成目标时,一旦检测到该世代堆栈内的存储器不足,则搜索该世代堆栈内作为使用完而未释放的目标,通过释放搜索到的目标来进行形成空区域的处理。
下面,说明不用存储单元收集装置200的详细处理步骤。
另外,省略与实施例1相同处理的说明,下面主要说明与实施例1不同的处理。另外,在下面的流程图中,与实施例1的流程图相同的步骤序号的步骤表示相同的处理。
图11(a)表示目标生成部72进行的目标生成处理。
目标生成部72进行图11(a)所示的处理,取代图6(a)所示目标的生成处理。
步骤S1101:目标生成部72准备目标地址用obj,准备世代堆栈地址用变量heap。
步骤S602:接着,调用图6(b)所示的现在的世代堆栈取得处理,取得对应于现在执行中的方法的世代堆栈的地址。
步骤S1102:判断步骤S602中取得的地址指定的世代堆栈中是否存在足够宽的空区域。该判断例如可通过判断空区域的宽度是否比用于确保目标的区域大来进行。或者进行规定值的阈值判断。
步骤S1103:步骤S1102的判断结果,在没有足够宽的空区域的情况下,调用图11(c)所示的世代堆栈的清除处理,在世代堆栈清除部90中进行该世代堆栈的清除处理。
步骤S603:接着,从世代堆栈的空区域中确保目标区域,将目标的地址代入obj。
步骤S604:另外,分配obj指定的目标的部件变量,初始化目标区域。
由此,目标生成部72在生成目标时判断世代堆栈中是否有空隙,若无空隙,则通过清除处理形成空区域后,在空区域中生成目标。
图11(b)表示世代间目标移动转包处理的处理顺序。
世代间目标移动部82进行图7(a)、(b)及图8(a)所示的处理,在图8(b)的步骤S808中不进行图8(a)的世代间目标移动转包处理,而进行图11(b)所示的处理。
步骤S1106:世代间目标移动部82判断heap指定的世代堆栈中、即移动目的的世代堆栈中是否存在足够宽的空区域。该判断与步骤S1102相同。
步骤S1107:步骤S1106的判断结果,在没有足够宽的空区域的情况下,调用图11(c)所示世代堆栈的清除处理,在世代堆栈清除部90中进行对该世代堆栈的清除处理。
从而,世代间目标移动部82判断在移动目标时世代堆栈中是否有空隙,若没有空隙,则通过清除处理形成空区域后,将目标移动到该空区域中。
图11(c)表示世代堆栈的清除处理的处理顺序。
步骤S1104:世代堆栈清除部90调用并执行图12(a)所示世代堆栈的标志处理。
步骤S1105:接着调用并执行图13所示的世代堆栈的扫描处理。
这里,标志处理是对处理对象的世代堆栈附加通过参照关系搜索到的所有目标的标志的处理,即将到达标记从0变为1的处理,扫描处理是回收未附加标志的目标的处理,即释放到达标记为0的目标的处理。
图12(a)表示世代堆栈的标志处理的处理顺序。
步骤S1201:世代堆栈清除部90准备变量stack,作为存储目标地址的堆栈,准备变量work用于世代堆栈的地址,准备变量obj、ptr,用于目标的地址。
步骤S602:接着,调用图6(b)所示的现在的世代堆栈取得处理,取得表示对应于现在执行中的方法的世代堆栈地址的work。
步骤S1203:对于work指定的世代堆栈、即对应于现在执行中的方法的世代堆栈中包含的所有目标,对目标具有的到达标记设置0。
步骤S1204:将位于work指定的世代堆栈中的母指示字的内容代入work。
步骤S1205:在work不等于heap(清除对象的世代堆栈的地址)期间,重复步骤S1203及步骤S1204,通过该重复,对清除对象的世代堆栈以后的新的世代堆栈,对其中包含的目标的到达标记设置0。
步骤S602:接着,世代堆栈清除部90调用图6(b)所示的现在的世代堆栈取得处理,取得表示现在的世代堆栈地址的work。
步骤S1208:对于work指定的世代堆栈内的所有局部变量,将其值代入obj后,重复步骤S1209及步骤S1210。
步骤S1209:判断obj是否指定正确的目标,即局部变量是否指定目标。
步骤S1210:在步骤S1209中,在判断为指定正确的目标的情况下,调用并执行图12(b)所示的到达标记的标志处理。
这里,先说明到达标记的标志处理的步骤。
图12(b)表示到达标记的标志处理顺序。
步骤S1220:判断obj指定的目标到达标志是否为0。
步骤S1221:在步骤S1220中,在判断obj指定的目标到达标志为0的情况下,对该目标的到达标志设置1。
步骤S1222:将obj推进堆栈。该处理在后面用于根据obj指定的目标来搜索参照关系。
返回图12(a)的说明。
步骤S1212:将位于work指定的世代堆栈中的母指示字的内容代入work。
步骤S1213:在work不等于heap期间,重复步骤S1208-步骤S1212的处理。通过该重复,对于变为清除处理对象的世代堆栈以后的新的世代堆栈,对可根据世代堆栈内的局部变量搜索的所有目标具有的到达标志设置1。
步骤S1214:在stack不空期间,将从stack中推出的值代入obj后,重复步骤S1214与步骤S1219之间的处理。
步骤S1215:对于obj指定的目标内的所有目标变量,将其值代入ptr后,重复步骤S1215与步骤S1218之间的处理。
步骤S1216:判断ptr是否指定正确的目标。
步骤S1210:在步骤S1216中,在判断ptr指定正确的目标的情况下,调用并执行图12(b)所示到达标记的标志处理。
通过重复步骤S1214与步骤S1219之间的处理,对于能够根据对到达标记设置1的目标搜索到的所有目标,对这些目标的到达标记设置1。
这样,通过进行图12(a)及图12(b)的处理,对于能够直接或间接根据位于清除处理对象的世代堆栈以后的新的世代堆栈中的局部变量搜索到的所有目标,对到达标记设置1。
图13表示世代堆栈的扫描处理的处理顺序。
步骤S602:世代堆栈清除部90调用图6(b)所示的现在的世代堆栈取得处理,取得表示现在的世代堆栈地址的work。
步骤S1304:释放work指定的世代堆栈内的目标中到达标记为0的目标。
步骤S1305:将位于work指定的世代堆栈内的母指示字的内容代入work。
步骤S1306:在work不等于heap期间,重复步骤S1302-步骤S1306之间的处理。
通过步骤S1302-步骤S1306的重复,剩余能够直接或间接根据位于清除处理对象的世代堆栈以后的新的世代堆栈中的局部变量搜索到的目标,释放哪也不参照的目标后,可得到空的区域。
如上所述,实施例2的不用存储单元收集装置200除实施例1的不用存储单元收集装置100的功能外,在因为世代堆栈中没有空区域而不能生成或移动目标的情况下,对该世代堆栈和比其新的世代堆栈进行清除处理后形成空的区域,生成或移动目标。该清除处理因为不是对整个存储器区域而是仅对较新的世代堆栈进行,所以处理所需时间短。因此,不用存储单元收集装置200可用于需要应答性的应用程序中。
实施例3
下面,说明根据本发明实施例3的不用存储单元收集装置。
实施例3的不用存储单元收集装置除实施例2的不用存储单元收集装置200的功能外,还具有在图11(c)所示的世代堆栈的清除处理后,使未释放的剩余目标移动到较旧世代堆栈的功能。
图14是根据实施例3的不用存储单元收集装置300的结构图。
在该图中,不用存储单元收集装置300由帧生成部10、世代堆栈生成部20、帧释放部30、世代堆栈释放部40、世代堆栈管理部50、堆栈存储器管理部60、目标生成部72、世代堆栈清除部93及世代间目标移动部83构成。
下面,因为与图1及图9相同标号的结构要素功能相同,所以省略说明,主要说明不同标号的结构要素。
世代间目标移动部83除局部变量或部件变量的代入、目标的移动及世代堆栈的清除处理的调用等与实施例2的世代间目标移动部82同样的操作外,作为清除处理的结果,进行将未释放的使用中目标移动到一个旧世代堆栈中的处理。
世代堆栈清除部93除与实施例2的世代堆栈清除部90同样的世代堆栈的清除处理外,在该清除处理的执行中调用世代间目标移动部83的世代间目标移动处理。
下面,说明不用存储单元收集装置300的详细处理步骤。
另外,省略与实施例1及2相同处理的说明,下面主要说明不同的处理。另外,在下面的流程图中,与实施例1及2的流程图相同的步骤序号的步骤表示相同的处理。
图15表示世代堆栈清除部93进行的世代堆栈清除处理的处理顺序。
世代堆栈清除部93若在图11(a)及图11(b)的处理中调用世代堆栈的清除处理,则进行图15所示处理来取代图11(c)所示的世代堆栈的清除处理。
步骤S1104:世代堆栈清除部93调用并执行图12(a)所示的世代堆栈的标志处理。
步骤S1105:接着调用并执行图13所示的世代堆栈的扫描处理。
步骤S1501:之后,判断清除处理对象的世代堆栈的地址heap指定的世代堆栈的母指示字是否为NULL。判断结果,在为NULL的情况下,即在没有比heap指定的世代堆栈旧的世代堆栈的情况下,结束该清除处理。
步骤S1502:另一方面,判断结果在不是NULL指示字的情况下,作为将目标移动到较旧的世代的准备,首先,准备目标的地址用obj。
步骤S1503:接着,对于work指定的世代堆栈内的所有目标,将其地址代入obj后,重复步骤S1503-步骤S1505间的处理。
步骤S1504:将obj指定的目标移动到位于该目标所属世代堆栈中的母指示字指定的世代堆栈,将移动目的的地址代入obj。
步骤S713:执行图8(a)所示世代间目标移动处理。在图8(a)的处理中也可执行图11(b)的处理来取代执行图8(b)的处理。
这样,通过重复步骤S1502和步骤S1505的处理,世代堆栈标志处理及扫描处理的结果,未释放的目标移动到旧的世代的世代堆栈。
该图15所示的世代堆栈的清除处理因为是将较新的世代堆栈作为对象的局部处理,所以处理所需时间短。另外,执行图15所示世代堆栈的清除处理的时刻是在对于对象世代堆栈的方法的执行中。因此,本实施例的不用存储单元收集装置300因为该处理使应用程序中断的期间短,可预测其执行时刻,所以可用于需要应答性的应用程序中。
实施例4
下面,说明根据本发明实施例4的不用存储单元收集装置。
实施例4的不用存储单元收集装置除实施例1的不用存储单元收集装置100的功能外,还具有通过参考计数方式管理从何处参照目标,并在哪儿都未参照目标时释放该目标的功能。
图16是根据实施例4的不用存储单元收集装置400的结构图。
在该图中,不用存储单元收集装置400由帧生成部10、世代堆栈生成部20、帧释放部30、世代堆栈释放部40、世代堆栈管理部50、堆栈存储器管理部60、目标生成部74、世代间目标移动部84、被参照量变更部94及目标释放部95构成。在该图中,因为与图1相同标号的结构要素与实施例1相同,所以省略说明,下面,主要说明不同标号的结构要素。
目标生成部74对应于应用程序执行中的目标生成,确保存储器的一区域用于目标。此时,目标生成部74在目标内的管理用信息部分中设置用于保持被参照量的区域。被参照量是表示从几处参照该目标的计数值(称为参考计数)。
世代间目标移动部84向各世代堆栈中代入局部变量及目标的部件变量。另外,对于部件变量的代入,一旦检测到从旧世代堆栈的目标到新世代堆栈目标的参照关系,则进行使该新世代堆栈目标移动到旧世代堆栈的处理。
另外,世代间目标移动部84为了对应于局部变量或部件变量代入引起的参数关系的变化,在被参照量变更部94中进行被参照量变更等处理。
被参照量变更部94进行对应于局部变量或部件变量代入引起的参照关系的变化及目标释放引起的参照关系的变化,来进行变更目标的被参照量的处理,结果,在目标的被参照量变为0的情况下,在目标释放部95中释放该目标。
目标释放部95进行释放被参照量变为0的目标的处理。另外,在释放时,在被参照量变更部94中对应于释放引起的参照关系的变化进行被参照量的变更处理。
下面,说明不用存储单元收集装置400的详细处理步骤。
另外,省略与实施例1、2及3相同处理的说明,下面主要说明不同的处理。
图17表示目标生成部74进行的目标生成处理。目标生成部74进行图17所示处理来取代图6(a)。
步骤S601:目标生成部74准备heap用于确保世代堆栈的地址。
步骤S602:接着,调用图6(b)所示的现在的世代堆栈取得处理,取得对应于现在执行中的方法的世代堆栈的地址。
步骤S603:接着,从位于取得的地址的世代堆栈的空区域中确保目标区域,将其地址代入obj。
步骤S1801:对obj指定的目标的被参照量设置0。
步骤S604:向obj指定的目标分配部件变量,并初始化。
图18(a)表示世代间目标移动部84进行的向局部变量的代入处理。
步骤S1901:世代间目标移动部84一旦在应用程序的执行过程中发生对局部变量的代入,则判断adr指定的变量内容是否为对其它目标的指示字。Adr是对应于代入目的帧的世代堆栈内的代入目的的局部变量地址,步骤S1901判断已存储在该局部变量中的内容是否为指示字。
步骤S1902:判断结果,在判断为是指示字的情况下,在被参照量变更部94中执行图19(a)所示的被参照量减少处理。被参照量减少处理随着参照关系的消除减少目标的被参照量,结果,是释放哪儿都不参照的目标的处理。即,在步骤S1901及步骤S1902中,通过新的代入来消除现在存储在局部变量中的指示字,随着通过该消除而直接或间接生成的参照关系的消除,变更或释放目标的被参照量。
步骤S701:在步骤S1901及步骤S1902中,通过释放局部变更的现在值为指示值的情况下的该指示字的参照关系,将作为应重新代入局部变量的值val代入该局部变量中。
步骤S1903:接着,判断val是否是其它目标的指示字。
步骤S1904:判断结果,在判断为是指示字的情况下,在被参照量变更部94中执行图19(b)所示的被参照量增加处理。被参照量增加处理是随着参照关系的新发生来增加目标的被参照量的处理。即,在步骤S1903及步骤S1904中,随着新代入为指示字引起的新的参照关系的产生,将指示字指定的目标的被参照量增加1。
图18(b)表示世代间目标移动部84进行的向部件变量的代入处理。
步骤S1901:世代间目标移动部84一旦在应用程序的执行过程中发生对部件变量的代入,则判断adr指定的变量内容是否为对其它目标的指示字。adr是代入目的目标的地址obj指定的目标内的代入目的部件变量的地址,步骤S1901判断已存储在该部件变量中的内容是否为指示字。
步骤S1902:判断结果,在判断为是指示字的情况下,在被参照量变更部94中执行图19(a)所示的被参照量减少处理。
步骤S711:将作为应新代入部件变量值的val代入该部件变量中。
步骤S712:接着,判断val是否是对其它目标的指示字。
步骤S1904:判断结果,在判断为是指示字的情况下,在被参照量变更部94中执行图19(b)所示的被参照量增加处理。
步骤S713:还执行图8(a)所示的世代间目标移动处理。
图19(a)表示被参照量变更部94进行的被参照量减少处理。
步骤S2001:被参照量变更部94一旦输入作为目标地址的obj,则从obj指定的目标被参照量的值中减去1。这里,obj若是图18(a)的步骤S1902时,则是在该代入前存储在代入目的的局部变量中的指示字,若是图18(b)的步骤S1902时,则是在该代入前存储在代入目的的部件变量中的指示字。
步骤S2002:步骤S2001的处理结果,判断obj指定的目的的被参照量是否变为0。
步骤S2003:判断结果,在被参照量变为0的情况下,通过在目标释放部95中执行图20所示目标的释放处理,释放被参照量变为0的目标。
图19(b)表示被参照量变更部94进行的被参照量增加处理。
步骤S2004:被参照量变更部94将obj指定的目标被参照量的值增加1。这里,obj若是图18(a)的步骤S1904时,则是新代入代入目的局部变量中的指示字,若是图18(b)的步骤S1904时,则是新代入代入目的部件变量中的指示字。
图20表示目标释放部95进行的目标释放处理。
步骤S2101:准备变量work用于目标的地址存储。
步骤S2102:通过obj指定的目标的部件,在剩余指定其它目标的地址期间,将其代入work,重复步骤S1904的处理。
步骤S1904:调用图19(a)的被参照量减少处理后,在被参照量变更部94中执行。
步骤S2105:释放obj指定的目标区域。
如上所述,实施例4的不用存储单元收集装置400的优点在于在立即释放不用的目标成为空区域的可使用状态。
实施例5
下面,说明根据本发明实施例5的不用存储单元收集装置。
实施例4的不用存储单元收集装置400的参考计数方式的不用存储单元收集装置在目标指示字的参照关系循环的情况下,虽然不能根据基本指示字搜索的目标,但由于被参照量不变为0,所以不能释放不用的目标。因此,实施例5的不用存储单元收集装置作为组合图9所示不用存储单元收集装置200与图16所示不用存储单元收集装置400的结构,可进行参考计数方式的不用存储单元收集和标志和扫描方式的不用存储单元收集两者。
即,实施例5的不用存储单元收集装置虽未图示,但由帧生成部、世代堆栈生成部、帧释放部、世代堆栈释放部、世代堆栈管理部、堆栈存储器管理部、目标生成部、世代间目标移动部、世代堆栈清除部、被参照量变更部及目标释放部构成。
在上述结构中,帧生成部、世代堆栈生成部、帧释放部、世代堆栈释放部、世代堆栈管理部、堆栈存储器管理部分别与不用存储单元收集装置200或400中的帧生成部10、世代堆栈生成部20、帧释放部30、世代堆栈释放部40、世代堆栈管理部50、堆栈存储器管理部60一样。另外,被参照量变更部及目标释放部与不用存储单元收集装置400的被参照量变更部94及目标释放部95一样。世代堆栈清除部与不用存储单元收集装置200的世代堆栈清除部90一样。
目标生成部及世代间目标移动部具有分别组合不用存储单元收集装置200中的目标生成部72及世代间目标移动部82和不用存储单元收集装置400中的目标生成部74及世代间目标移动部84后的功能。
即,实施例5的目标生成部对应于应用程序执行时的目标生成,将存储器的一区域确保用于目标数据存储。此时,目标生成部在目标内的管理用信息部分中设置保持被参照量的区域和存储到达标记的区域。在该生成中,在检测到对象的世代堆栈中没有确保目标的充足区域的情况下,在世代堆栈清除部中执行清除处理,结果在形成的空区域中确保目标。
另外,实施例5的世代间目标移动部向各世代堆栈中代入局部变量及目标的部件变量。在部件变量的代入中,一旦检测到从旧世代堆栈目标到新世代堆栈目标的参照关系,则进行将该新世代堆栈目标移动到旧世代堆栈的处理。另外,世代间目标移动部随着局部变量或部件变量代入引起的参照关系的变化,在被参照量变更部中进行被参照量的变量和哪儿都未参照的目标的释放。在该移动中,在检测到移动目的的旧世代堆栈中没有充足的存储移动对象的目标的区域的情况下,在世代堆栈清除部中执行该旧世代堆栈及比其新的世代堆栈的清除处理,结果,在形成的旧世代堆栈的空区域中存储移动对象的目标。
图21表示实施例5的不用存储单元收集装置的动作。
该图中,步骤S21、步骤S22及步骤S23与实施例1等相同。
在步骤S24中,目标生成部在世代堆栈中生成具有被参照量和到达标记区域的目标。此时,在对象的世代堆栈中因没有空的区域而不能生成目标的情况下,移动到步骤S1701的处理。在步骤S1701中,世代堆栈清除部对对象的世代堆栈进行标志处理,之后进行扫描处理。
另外,在步骤S25中,世代间目标移动部进行向变量的代入、目标的移动处理,随着这些处理,被参照量变更部进行各目标的被参照量的变更处理及目标的释放等。此时,在因对象的世代堆栈中没有区域而不能移动目标的情况下,移动到步骤S1701的处理。
这样,组合参考方式和标志和扫描方式,在步骤S24和步骤S25中,通过参考计数方式进行目标的释放,在存储器不足时,在步骤S1701中通过标志和扫描方式释放存在于环状参照关系的目标。步骤S1701的处理虽仅在存储器不足时执行,但在步骤S24和步骤S25中,因为通过参考计数方式进行目标释放,所以成为存储器不足的频率少,另外,步骤S1701的处理由于是以较新的世代堆栈为对象的处理,所以与以整体为对象的情况不同,处理所需时间短。此外,虽然省略说明,但与实施例1相同的处理部分与实施例1一样处理时间短,可预测其时间,所以不用存储单元收集装置也可用于需要应答性的应用程序中。
实施例6
根据实施例6的不用存储单元收集装置在实施例5的不用存储单元收集装置中的步骤S1701的处理后,如实施例3的不用存储单元收集装置300一样,将通过步骤S1701处理未释放的目标移动到更旧的世代堆栈。
实施例7
下面说明根据实施例7的不用存储单元收集装置。
实施例1中的各不用存储单元收集装置在每次调用方法时生成的世代堆栈内生成目标。相反,实施例7的不用存储单元收集装置与实施例1的不同之处在于:不是在世代堆栈而是在其它存储器区域(下面称为实体存储器)中生成目标自身,并在世代堆栈中生成对目标的指示字。
图28(a)及(b)表示以实施例7的不用存储单元收集装置中的世代堆栈为中心的存储器结构一例。
在图28(a)中,不用存储单元收集装置首先通过执行应用程序,若调用第一方法,则生成一个作业用帧(未图示),用于第一方法,对应于该帧生成第一世代堆栈。另外,在第一世代堆栈中确保用于局部变量(未图示)及对目标的指示字的区域,并初始化各区域。
接着,若在第一方法的执行中调用第二方法,则通过与前面一样的步骤生成帧(未图示)及第二世代堆栈,在第二世代堆栈内确保并初始化用于局部变量(未图示)及对目标的指示字的区域。
另外,一旦在第二方法的执行中调用第三方法,则通过与前面一样的步骤生成帧(未图示)及第三世代堆栈,在第三世代堆栈内确保并初始化用于局部变量(未图示)及对目标的指示字的区域。这里,各目标具有用于保持指定目标的指示字所属世代序号的区域,在图(a)及(b)中,在各目标的左上角附加序号进行表示。
这样,在生成世代堆栈的同时,若在各方法的执行中存在目标的生成,则在实体存储器的空区域中确保目标用区域,在对应于该方法的世代堆栈中存储对目标的指示字。
另外,在发生从旧世代堆栈的指示字指定的目标到新世代堆栈的指示字指定的目标参照的情况下,将新世代堆栈的指示字拷贝到旧世代堆栈中。
下面,具体说明该拷贝。
在图28(a)中,位于第一世代堆栈中的指示字2900指位于实体存储器中的目标A,位于第三世代堆栈中的指示字2901指位于实体存储器中的目标B,位于第二世代堆栈中的指示字2902指位于实体存储器中的目标C。另外,目标A参照目标B(图中用虚线箭头表示),目标B参照目标C。
在这种参照关系中,从目标A到目标B的参照是从第一世代堆栈的指示字2900指的目标A到第三世代堆栈中的指示字2901指的目标B的参照,即,是从旧堆栈的指示字指的目标到新堆栈指示字指的目标的参照。在存在这种参照关系的情况下,将新世代堆栈的指示字值拷贝到旧世代堆栈中。即,指示目标B的第三世代堆栈中的指示字2901的值被拷贝到第一世代堆栈中。图28(b)的第一世代堆栈中的指示字2903表示是指示字2901的拷贝。此时,目标B具有的世代序号随着指示字的拷贝从拷贝源的世代堆栈的世代序号3变更为拷贝目的的世代序号1。
通过将指示字2901拷贝为指示字2903,从目标B到目标C的参照不仅变为从第三世代堆栈的指示字2901指示的目标B到第二世代堆栈的指示字2902指示的目标C的参照,而且变为从第一世代堆栈的指示字2903指示的目标B到第二世代堆栈的指示字2902指示的目标C的参照。因此,指示目标B的指示字的拷贝结果,对于目标B及目标C的关系,也变为从旧世代堆栈的指示字指示的目标到新世代堆栈指示字指示目标的参照关系。因此,第二世代堆栈的指示字2902的值也拷贝为第一世代堆栈的指示字2904,目标C具有的世代序号从拷贝源的指示字2902的某世代堆栈的世代序号2变更为拷贝目的的指示字2904的某个世代堆栈的世代序号1。这一系列指示字的拷贝结果,存储器的结构如图28(b)所示。
在这种拷贝的方法的情况下,具有在指示字移动后不需要删除新世代堆栈的指示字的处理的优点。
下面,具体说明世代堆栈的释放。
图29(a)及(b)表示释放第三世代堆栈情况下的存储器结构的变化实例。
在图28(b)的状态下,一旦结束执行对应于第三世代堆栈的方法,则不用存储单元收集装置判断位于第三世代堆栈中的指示字指示的目标的世代序号是否为3。该判断中,目标的世代序号与指示目标的指示字所属世代堆栈的世代序号一致,所以剩余世代序号不一致的目标,释放一致的目标。判断的结果,目标2905、2906及2907是世代序号3的目标。从而,不用存储单元收集装置释放目标2905、2906及2907,结果,存储器结构如图29(b)所示。
下面,说明实施例7的不用存储单元收集装置的详细处理步骤。实施例7的不用存储单元收集装置的基本结构与图1所示不用存储单元收集装置100的结构图基本相同,所以利用图1的结构图,主要说明与不用存储单元收集装置100不同的部分。
图23表示实施例7的世代堆栈生成部20进行的世代堆栈生成处理的处理顺序。
步骤S411:世代堆栈生成部20通过调用图4(c)所示堆栈存储器生成处理后在堆栈存储器管理部60中执行,在堆栈存储器区域中确保世代堆栈,取得其地址作为heap。
步骤S2301:接着,在确保的世代堆栈内分配局部变量并初始化。
步骤S2302:在heap指示的世代堆栈内分配规定数量(例如1024个)对目标的指示字,用NULL初始化各指示字。
步骤S413:最后,通过调用图4(d)所示世代堆栈的进栈处理,在世代堆栈管理部50中执行,将世代堆栈堆积成堆栈。
这样,世代堆栈生成部20在每次调用方法时,生成由局部变量、对目标的指示字、指示一个世代的旧的世代堆栈的母指示字构成的世代堆栈。
图25(a)及(b)表示实体存储器的生成处理及实体存储器的释放处理。
堆栈存储器管理部60除进行图4(c)及图5(d)所示堆栈存储器的生成处理及释放处理外,在应用程序开始执行及结束时,进行在存储器上生成大尺寸的存储器块,用于目标确保,将其地址代入entity中的处理(步骤S2501)和释放entity指示的存储器块的处理(步骤S2502)。
图26表示实施例7的不用存储单元收集装置中的目标生成部70进行的目标生成处理。
步骤S601:目标生成部70准备变量heap用于世代堆栈的地址确保。
步骤S2701:根据entity指示的实体存储器的空区域来分配目标,将该目标的地址代入obj。
步骤S602:调用图6(b)所示现在的世代堆栈取得处理,取得对应于现在执行中的方法的世代堆栈的地址。
步骤S2702:从收纳heap指示的世代堆栈目标的指示字的区域搜索空区域,将obj的内容代入其中。
步骤S2703:将heap指示的世代堆栈的世代序号代入obj指示的目标的世代序号中。
步骤S604:在obj指示的目标中分配部件变量后进行初始化。
图27表示实施例7的不用存储单元收集装置中的世代间目标移动部80进行的世代间目标移动转包处理。世代间目标移动部80进行向位于世代堆栈中的局部变量代入或向位于实体存储器中的目标的部件变量代入,若发生目标间的参照关系,则进行图8(a)所示的世代间目标移动处理。此时,世代间目标移动部80在图8(a)的步骤S808中进行图27所示处理来取代图8(b)。
步骤S2801:世代间目标移动部80从收纳heap指示的世代堆栈目标的指示字的区域搜索空区域,将obj的内容代入其中。
步骤S2802:将heap指示的世代堆栈的世代序号代入obj指示的目标的世代序号中。
这样,世代间目标移动部80在世代堆栈间移动对目标的指示字的情况下,将指示字所属世代堆栈的世代序号代入具有对应于移动指示字的目标的世代序号中。
图24表示实施例7的世代堆栈释放部40进行的世代堆栈的释放处理。一旦在结束应用程序中的方法后,由帧释放部30执行图5(a)所示处理,调用步骤S501的世代堆栈的释放处理,则世代堆栈释放部40进行图24所示处理。
步骤S2401:世代堆栈释放部40准备对堆栈存储器的指示字用变量heap、对目标的指示字用变量obj和世代序号用变量g。
步骤S602:接着,调用图6(b)所示现在的世代堆栈取得处理后,通过在世代堆栈管理部50中执行,取得作为对应于现在执行中的方法的世代堆栈地址的heap。
步骤S2402:将heap指示的世代堆栈的世代序号代入g。
步骤S2403:在位于heap指示的世代堆栈中的指示字中,在剩余指示目标的指示字期间,将其代入obj后,将NULL代入该指示字中,重复步骤S2403与步骤S2406之间的处理。
步骤S2402:判断obj指示的目标的世代序号是否是在步骤S2402中代入的g。
步骤S2405:判断结果,在obj指示的目标的世代序号与g一致时,释放obj指示的目标的区域。
另一方面,判断结果,在不一致的情况下什么都不作。即,在目标具有的世代序号与释放对象的世代堆栈的世代序号不一致的情况下,不释放该目标。因为该目标是由位于该目标具有的世代序号的世代堆栈中的指示字指示的。
步骤S511:通过调用图5(c)所示世代堆栈的出栈处理,从堆栈中去除对象的世代堆栈,释放世代堆栈。
这样,实施例7的不用存储单元收集装置一旦在方法的执行中生成目标,则在实体存储器中生成目标,并在对应于方法的世代堆栈中生成对该目标的指示字。另外,通过向目标的部件变量中代入值,在发生从旧世代堆栈的指示字指示的目标到新世代堆栈的指示字指示的目标的参照关系时,将新世代堆栈的指示字拷贝到旧世代堆栈中。另外,一旦方法结束,则释放对应的帧及世代堆栈。在该释放中,将NULL代入世代堆栈的指示字中,去除从其它世代堆栈指示的目标后,释放该世代堆栈的指示字指示的目标。
实施例8
下面,说明根据实施例8的不用存储单元收集装置。
根据实施例8的不用存储单元收集装置与实施例7的不用存储单元收集装置一样,在世代堆栈内生成对目标的指示字,在实体存储器中生成目标自身。实施例8与实施例7的不同之处在于,在实施例8的不用存储单元收集装置中,各目标具有指示该目标的指示字地址作为逆指示字来取代世代序号,并且在世代间使目标移动来取代拷贝对目标的指示字。其它与实施例7基本一样。下面,主要说明不同点。
图22(a)表示以实施例8的不用存储单元收集装置中的世代堆栈为中心的存储器结构一例。
图22(a)中,不用存储单元收集装置首先通过执行应用程序,若调用第一方法,生成一个作业用帧(未图示),用于第一方法,对应于该帧生成第一世代堆栈。另外,在第一世代堆栈中确保用于局部变量(未图示)及对目标的指示字的区域,并初始化各区域。
接着,若在第一方法的执行中调用第二方法,则通过与前面一样的步骤生成帧(未图示)及第二世代堆栈,在第二世代堆栈内确保并初始化用于局部变量(未图示)及对目标的指示字的区域。
另外,一旦在第二方法的执行中调用第三方法,则通过与前面一样的步骤生成帧(未图示)及第三世代堆栈,在第三世代堆栈内确保并初始化用于局部变量(未图示)及对目标的指示字的区域。
这样,在生成世代堆栈的同时,若在各方法的执行中生成目标,则在实体存储器的空区域中确保目标用区域,在对应于该方法的世代堆栈中存储对目标的指示字。
另外,在发生从旧世代堆栈的指示字指示的目标到新世代堆栈的指示字指示的目标参照的情况下,将新世代堆栈的指示字移动到旧世代堆栈中。
下面,具体说明该移动。
在图22(a)中,位于第一世代堆栈中的指示字2200指示位于实体存储器中的目标A,位于第三世代堆栈中的指示字2201指示位于实体存储器中的目标B,位于第二世代堆栈中的指示字2202指示位于实体存储器中的目标C。另外,目标A参照目标B(图中用虚线箭头表示),目标B参照目标C。
在这种参照关系中,从目标A到目标B的参照是从第一世代堆栈的指示字2200指示的目标A到第三世代堆栈中的指示字2201指示的目标B的参照,即,是从旧堆栈的指示字指示的目标到新堆栈指示字指示的目标的参照。在存在这种参照关系的情况下,将新世代堆栈的指示字值移动到旧世代堆栈中。即,第三世代堆栈的指示字2201移动到第一世代堆栈中。
通过指示字2201的移动,从目标B到目标C的参照变为从第一世代堆栈的指示字2201指示的目标B到第二世代堆栈的指示字2202指示的目标C的参照,即变为从旧世代堆栈的指示字指示的目标到新世代堆栈的指示字指示的目标的参照。因此,第二世代堆栈的指示字2202也移动到第一世代堆栈,结果,世代堆栈的结构如图22(b)所示。
这样,对于实施例8的不用存储单元收集装置,虽然位于实体存储器中的目标的位置未移动,但通过在世代堆栈间移动对位于世代堆栈中的目标的指示字,可间接变更目标所属世代。当结束方法的执行时,与释放对应于方法的帧一起,一次性地释放对应的世代堆栈。通过这种释放方法,因为不进行常规技术那样搜索使用完的目标后,释放搜索到的使用完的目标的耗时的操作,所以可在短时间内进行处理。
下面,说明实施例8的不用存储单元收集装置的详细处理步骤。实施例8的不用存储单元收集装置的基本结构与图1所示不用存储单元收集装置100的结构图基本相同,另外,各结构要素的处理步骤与实施例7的不用存储单元收集装置基本相同,所以,下面利用图1的结构图,主要说明与不用存储单元收集装置100及实施例7的不用存储单元收集装置不同的部分。
图31表示实施例8中的不用存储单元收集装置的目标生成部70进行的目标生成处理的处理顺序。
步骤S601:目标生成部70准备变量heap,用于世代堆栈的地址确保。
步骤S2701:根据entity指示的实体存储器的空区域来分配目标,将该目标的地址代入obj。这里,实体存储器与实施例7一样,通过图25(a)及(b)所示实体存储器的生成处理及实体存储器的释放处理来生成及释放。
步骤S602:调用图6(b)所示现在的世代堆栈取得处理,在heap中取得对应于现在执行中的方法的世代堆栈的地址。
步骤S3101:从收纳heap指示的堆栈存储器对目标的指示字的区域中搜索空隙,将obj的内容代入其中,将该区域的地址代入obj指示的目标的逆指示字中。
步骤S604:分配并初始化obj指示的目标的部件变量。
图32表示实施例8的不用存储单元收集装置中的世代间目标移动部80进行的世代间目标移动转包处理。世代间目标移动部80进行向位于世代堆栈中的局部变量代入或向位于实体存储器中的目标的部件变量代入,若发生目标间的参照关系,则进行图8(a)所示的世代间目标移动处理。此时,世代间目标移动部80在图8(a)的步骤S808中进行图32所示处理来取代图8(b)。
步骤S3201:将NULL代入obj指示的目标的逆指示字指示的区域中。
步骤S3202:从收纳heap指示的堆栈存储器对目标的指示字的区域搜索空区域,将obj的内容代入其中,将该区域的地址代入obj指示的目标的逆指示字中。
因此,世代间目标移动部80通过将NULL代入指示此前目标的指示字中,解除新世代堆栈的指示字与目标的关系,在老世代堆栈中重新生成对目标的指示字,并在目标中生成其逆指示字。
图30表示世代堆栈释放部40进行的世代堆栈释放处理的处理顺序。实施例8中的不用存储单元收集装置的世代堆栈释放部40一旦在图5(a)的帧释放处理中的步骤S501中调用世代堆栈的释放处理,则进行图30的处理。
步骤S3001:世代堆栈释放部40准备堆栈存储器地址用变量heap、用于目标的间接指示字的变量ptr、用于目标直接指示字的变量obj。
步骤S602:接着,调用图6(b)所示现在的世代堆栈取得处理后,取得对应于现在执行中的方法的世代堆栈地址。
步骤S3002:接着,通过heap指示的堆栈存储器对目标的指示字,在剩余指示目标的地址期间,将该指示字的地址代入ptr,并重复步骤S3002与步骤S3006之间的处理。
步骤S3003:将ptr指示的区域内容代入obj。
步骤S3004:判断obj指示的目标的逆指示字是否与ptr一致。
步骤S3005:判断结果,在一致的情况下,释放obj指示的目标区域,在不一致的情况下,什么也不作。
步骤S511:最后,调用图5(c)所示世代堆栈的出栈处理,从堆积世代堆栈的堆栈中去除一个世代堆栈后进行释放。
其它实施例
实施例1至6中目标间的参照是目标通过保持对其它目标的指示字来直接参照其它目标的方式。也可以设置保持所谓句柄存储器的保持句柄的区域,通过句柄来构筑目标间的所有参照关系的方式来取代该方式。例如,从目标A到目标B的参照在实施例1-6的情况下通过目标A保持指示目标B的指示字来表示。相反,在经句柄的方式的情况下,目标A保持指示句柄的指示字,该句柄保持指示目标B的指示字。在通过这种方式向其它世代堆栈移动目标B的情况下,不变更目标A保持的指示字,变更句柄保持的指示字。
下面,表示使用该方式情况下实施例1至6的变更点及追加点。
图33(a)及(b)表示应向实施例1至6的不用存储单元收集装置追加的处理。如图33(a)所示,不用存储单元收集装置一旦开始执行应用程序,则通过确保大尺寸的存储器块,生成句柄保持用句柄存储器,并将其地址代入entity中(步骤S3301)。另外,如图33(b)所示,一旦执行应用程序结束,则释放entity指示的句柄存储器(handle memory)(步骤S3302)。
图34表示实施例1的目标生成部应取代图6(a)所进行的目标生成处理。
步骤S601:目标生成部准备变量heap,用于世代堆栈的地址确保。
步骤S602:接着,调用图6(b)所示的现在的世代堆栈取得处理,取得对应于现在执行中的方法的世代堆栈的地址。
步骤S3401:根据句柄存储器的空区域分配句柄,将其地址代入obj。
步骤S3402:根据heap指示的世代堆栈的空区域分配目标,将该目标的地址代入obj指示句柄的「对应目标」区域中,并将obj的内容代入目标的「对应句柄」区域中。
步骤S604:另外,分配obj指示的目标的部件变量,初始化目标区域。
图37表示实施例2和3的目标生成部取代图11(a)进行的目标生成处理。
步骤S1101:目标生成部准备目标地址用obj,准备世代堆栈地址确保用变量heap。
步骤S602:接着,调用图6(b)所示的现在的世代堆栈取得处理,取得对应于现在执行中的方法的世代堆栈的地址。
步骤S1102:判断步骤S602中取得的地址指示的世代堆栈中是否存在足够宽的空区域。
步骤S1103:步骤S1102的判断结果,在没有足够宽的空区域的情况下,调用世代堆栈的清除处理,在世代堆栈清除部中进行该世代堆栈的清除处理。
步骤S3701:根据句柄存储器的空区域分配句柄,将其地址代入obj。
步骤S3702:根据heap指示的世代堆栈的空区域来分配目标,将该目标的地址代入obj指示的句柄的「对应目标」区域中,并将obj的内容代入目标的「对应句柄」区域中。
步骤S604:分配obj指示的目标的部件变量,初始化目标区域。
图38表示实施例4的目标生成部取代图17应进行的目标生成处理。
步骤S601:目标生成部准备变量heap,用于世代堆栈的地址确保。
步骤S602:接着,调用图6(b)所示的现在的世代堆栈取得处理,取得对应于现在执行中的方法的世代堆栈的地址。
步骤S3801:根据句柄存储器的空区域分配句柄,将其地址代入obj。
步骤S3802:根据heap指示的世代堆栈的空区域分配目标,将该目标的地址代入obj指示句柄的「对应目标」区域中,并将obj的内容代入目标的「对应句柄」区域中。
步骤S1801:对obj指示的目标的被参照量设置0。
步骤S604:分配obj指示的目标的部件变量,初始化目标区域。
图40表示实施例5和6的目标生成部应进行的目标生成处理。
步骤S601:目标生成部准备变量heap,用于世代堆栈的地址确保。
步骤S602:接着,调用图6(b)所示的现在的世代堆栈取得处理,取得对应于现在执行中的方法的世代堆栈的地址。
步骤S1102:判断步骤S602中取得的地址指示的世代堆栈中是否存在足够宽的空区域。
步骤S1103:步骤S1102的判断结果,在没有足够宽的空区域的情况下,调用世代堆栈的清除处理,在世代堆栈清除部中进行该世代堆栈的清除处理。
步骤S4006:根据句柄存储器的空区域分配句柄,将其地址代入obj。
步骤S4007:根据heap指示的世代堆栈的空区域分配目标,将该目标的地址代入obj指示句柄的对应目标区域中,并将obj的内容代入目标的对应句柄区域中。
步骤S1801:对obj指示目标的被参照量设置0。
步骤S604:分配obj指示的目标的部件变量,初始化目标区域。
图36表示实施例1至4的世代间目标移动部应取代图8(b)进行的世代间目标移动转包处理。
步骤S3601:将对应于obj指示句柄的目标移动到heap指示的世代堆栈中。
步骤S3602:将移动目的的目标地址代入obj指示句柄的「对应目标」区域中。
图39表示实施例4至6的目标释放部应取代图20进行的目标释放处理。
步骤S2101:目标释放部准备变量work用于目标的地址存储。
步骤S2102:通过obj指示的目标的部件,在剩余指示其它目标的地址期间,将其代入work,重复步骤S1904的处理。
步骤S1904:调用被参照量减少处理后,在被参照量变更部中执行。
步骤S3901:释放obj指示的目标的「对应句柄」区域指示的句柄。
步骤S2105:释放obj指示的目标区域。
图35表示实施例1至6的世代堆栈释放部应取代图5(b)进行的世代堆栈的释放处理。
步骤S3501:世代堆栈释放部准备变量heap,作为对堆栈存储器的指示字,准备变量obj,作为对目标的指示字。
步骤S602:调用图6(b)所示的现在的世代堆栈取得处理,取得对应于现在执行中的方法的世代堆栈的地址。
步骤S3503:将heap指示的世代堆栈的世代序号代入g。
步骤S3504:对于heap指示的堆栈存储器的所有目标,将其地址代入obj,重复步骤S3505。
步骤S3505:释放obj指示目标的「对应句柄」指示的句柄。
步骤S511:调用图5(c)所示世代堆栈的出栈处理,从堆栈中去除对象的世代堆栈,释放世代堆栈。
这样,对于通过句柄来表示参照关系的方式而言,当在世代堆栈间移动目标时,可仅变更对应于该目标的句柄具有的指示字。相反,在实施例1至6的不通过句柄而在目标间直接参照的方式的情况下,当移动目标时,必需变更所有指示该目标的指示字。从而,对于通过句柄来表示参照关系的方式而言,关于一个目标的移动,消耗将目标实际移动所需时间与对应句柄内指示字变更所需时间相加后的时间。因为该时间一定,所以若事先掌握移动对象的目标数量,则一个目标移动所需时间与移动对象的目标数量相乘后的时间为处理时间,可准确地预测处理时间。所以,可预测处理时间的不用存储单元收集装置可用于需要应答性的应用程序中。
上面虽然说明了各实施例,但除上述实施例外,也可组合由实施例彼此可组合的实例来实施。
将各实施列中的不用存储单元收集装置的动作步骤设为通用的计算机或具有程序执行功能的设备等中执行用的计算机程序,可记录在记录媒体中或经各种通信路径等流通分发。在这种记录媒体中有IC卡、光盘、软盘、ROM等。
也可将各实施例中的不用存储单元收集装置的动作步骤作为方法来实施。
参照附图,通过实施例已完整描述了本发明,值得注意的是,对于本领域的技术人员而言,不同的改变和变更是显而易见的。因此,除非这种改变和变更脱离本发明的范围,否则应认为它们被包括在内。
Claims (20)
1.一种不用存储单元收集装置,应用程序不使用的存储区域释放,所述装置包含:
确保单元,在每次开始执行构成应用程序的方法时确保对应于该方法的方法用存储器区域;
管理单元,管理由上述确保单元确保的各方法用存储器区域彼此的确保时期的先后关系;
移动单元,在某个方法用存储器区域中记录指示字时,根据上述管理单元中管理的先后关系判断该方法用存储器区域的确保时期是否比记录由该指示字指示的数据的方法用存储器区域的确保时期早,在判断为早的情况下,将该数据移动到记录该指示字的方法用存储器区域;和
释放单元,在方法执行结束的情况下,释放对应于该执行结束的方法的方法用存储器区域。
2.根据权利要求1所述的不用存储单元收集装置,其特征在于,
还包含:
不用存储单元收集单元,在检测到对应于执行中的方法的方法用存储器区域或作为上述移动单元的数据移动目的的方法用存储器区域的存储器不充足的情况下,搜索该方法用存储器区域中未被任何指示字指定的数据,释放存储该数据的区域。
3.根据权利要求2所述的不用存储单元收集装置,其特征在于,
上述不用存储单元收集单元通过标志和扫描方式来进行上述搜索和上述释放。
4.根据权利要求1所述的不用存储单元收集装置,其特征在于,
还包含:
目标释放单元,目标保持表示被参照数的参考计数,随着因应用程序执行产生的目标间的参照状态变更,变更各目标保持的参考计数,释放参考计数变更为0的目标。
5.根据权利要求2所述的不用存储单元收集装置,其特征在于,还包含:目标释放单元,目标保持表示被参照数的参考计数,随着因应用程序执行产生的目标间的参照状态变更,变更各目标保持的参考计数,释放参考计数变更为0的目标。
6.根据权利要求3所述的不用存储单元收集装置,其特征在于,
还包含:
目标释放单元,目标保持表示被参照数的参考计数,随着因应用程序执行产生的目标间的参照状态变更,变更各目标保持的参考计数,释放参考计数变更为0的目标。
7.根据权利要求2所述的不用存储单元收集装置,其特征在于,
上述移动单元还使上述不用存储单元收集单元处理后的上述方法用存储器区域中未释放的残留目标移动到比上述方法用存储器区域先确保的方法用存储器区域。
8.根据权利要求3所述的不用存储单元收集装置,其特征在于,
上述移动单元还使上述不用存储单元收集单元处理后的上述方法用存储器区域中未释放的残留目标移动到比上述方法用存储器区域先确保的方法用存储器区域。
9.根据权利要求4所述的不用存储单元收集装置,其特征在于,
上述移动单元还使上述不用存储单元收集单元处理后的上述方法用存储器区域中未释放的残留目标移动到比上述方法用存储器区域先确保的方法用存储器区域。
10.根据权利要求1所述的不用存储单元收集装置,其特征在于,
通过保持对将一方目标设置在句柄区域中的句柄的指示字,并且使句柄保持对另一方目标的指示字,经句柄来间接示出两个目标间的参照状态。
11.根据权利要求2所述的不用存储单元收集装置,其特征在于,
通过保持对将一方目标设置在句柄区域中的句柄的指示字,并且使句柄保持对另一方目标的指示字,经句柄来间接示出两个目标间的参照状态。
12.根据权利要求3所述的不用存储单元收集装置,其特征在于,
通过保持对将一方目标设置在句柄区域中的句柄的指示字,并且使句柄保持对另一方目标的指示字,经句柄来间接示出两个目标间的参照状态。
13.根据权利要求4所述的不用存储单元收集装置,其特征在于,
通过保持对将一方目标设置在句柄区域中的句柄的指示字,并且使句柄保持对另一方目标的指示字,经句柄来间接示出两个目标间的参照状态。
14.根据权利要求7所述的不用存储单元收集装置,其特征在于,
通过保持对将一方目标设置在句柄区域中的句柄的指示字,并且使句柄保持对另一方目标的指示字,经句柄来间接示出两个目标间的参照状态。
15.一种不用存储单元收集装置,应用程序不使用的存储区域释放,所述装置包含:
确保单元,在开始执行构成应用程序的方法的情况下,确保方法用存储器区域,记录确保的方法用存储器区域与方法的对应关系及确保的各方法用存储器区域彼此的确保时期的先后关系;
移动单元,在根据位于比该方法用存储器区域先确保的方法用存储器区域中的第二目标指示字所指示的目标来参照位于方法用存储器区域中的第一目标指示字指示的目标的情况下,将上述第一目标指示字移动到确保为上述目的的方法用存储器区域;和
释放单元,在方法执行结束的情况下,释放对应于该方法的方法用存储器区域和哪都未参照的目标。
16.根据权利要求15所述的不用存储单元收集装置,其特征在于,
上述移动单元拷贝上述第一目标指示字来取代移动到确保为上述目的的方法用存储器区域。
17.根据权利要求15所述的不用存储单元收集装置,其特征在于,
上述各目标保持特定指示该目的的目标指示字所属的方法用存储器区域的信息,上述释放单元就上述目标的释放而言释放保持特定释放对象的方法用存储器区域的信息的目标。
18.根据权利要求15所述的不用存储单元收集装置,其特征在于,
上述各目标保持表示指示该目的的目标指示字地址的逆指示字,上述释放单元就上述目标的释放而言释放将属于释放对象的方法用存储器区域的目标指示字地址保持为逆指示字的目标。
19.一种不用存储单元收集方法,应用程序不使用的存储区域释放,所述方法包含:
确保步骤,在每次开始执行构成应用程序的方法时确保对应于该方法的方法用存储器区域;
管理步骤,管理由上述确保步骤确保的各方法用存储器区域彼此的确保时期的先后关系;
移动步骤,在某个方法用存储器区域中记录指示字时,根据上述管理步骤中管理的先后关系判断该方法用存储器区域的确保时期是否比记录由该指示字指示的数据的方法用存储器区域的确保时期早,在判断为早的情况下,将该数据移动到记录该指示字的方法用存储器区域;和
释放步骤,在方法执行结束的情况下,释放对应于该执行结束的方法的方法用存储器区域。
20.一种不用存储单元收集方法,应用程序不使用的存储区域释放,所述方法包含:
确保步骤,在开始执行构成应用程序的方法的情况下,确保方法用存储器区域,记录确保的方法用存储器区域与方法的对应关系及确保的各方法用存储器区域彼此的确保时期的先后关系;
移动步骤,在根据位于比该方法用存储器区域先确保的方法用存储器区域中的第二目标指示字所指示的目标来参照位于方法用存储器区域中的第一目标指示字指示的目标的情况下,将上述第一目标指示字移动到上述先确保的方法用存储器区域;和
释放步骤,在方法执行结束的情况下,释放对应于该方法的方法用存储器区域和哪都未参照的目标。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2001382148A JP3939975B2 (ja) | 2001-12-14 | 2001-12-14 | ガベージコレクション装置、ガベージコレクション方法及びガベージコレクションプログラム |
JP382148/01 | 2001-12-14 | ||
JP382148/2001 | 2001-12-14 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN1432919A CN1432919A (zh) | 2003-07-30 |
CN1280730C true CN1280730C (zh) | 2006-10-18 |
Family
ID=19187420
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNB021542465A Expired - Fee Related CN1280730C (zh) | 2001-12-14 | 2002-12-13 | 不用存储单元收集装置及不用存储单元收集方法 |
Country Status (4)
Country | Link |
---|---|
US (1) | US6839726B2 (zh) |
EP (1) | EP1320034A3 (zh) |
JP (1) | JP3939975B2 (zh) |
CN (1) | CN1280730C (zh) |
Families Citing this family (39)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7127709B2 (en) * | 2002-09-25 | 2006-10-24 | Microsoft Corporation | System and method for jointly managing dynamically generated code and data |
US7730449B2 (en) * | 2003-03-19 | 2010-06-01 | Toshiba Corporation | Auto reference counting pointer for C++ objects with ability to re-cast and lookup from a free pointer |
US8108628B2 (en) * | 2003-08-04 | 2012-01-31 | Azul Systems, Inc. | Processor instruction used to perform a matrix test to generate a memory-related trap |
US20050081190A1 (en) * | 2003-09-30 | 2005-04-14 | International Business Machines Corporation | Autonomic memory leak detection and remediation |
CN101504702B (zh) * | 2005-03-10 | 2012-05-30 | 日本电信电话株式会社 | 存储系统和存储控制方法 |
US7962707B2 (en) * | 2005-07-06 | 2011-06-14 | Honeywell International Inc. | Apparatus and method for deterministic garbage collection of a heap memory |
US20070088908A1 (en) * | 2005-10-17 | 2007-04-19 | Phison Electronics Corp. | Method for arranging heap memory |
US7827373B2 (en) * | 2005-10-31 | 2010-11-02 | Honeywell International Inc. | System and method for managing a short-term heap memory |
US8266609B2 (en) * | 2005-12-07 | 2012-09-11 | Microsoft Corporation | Efficient placement of software transactional memory operations around procedure calls |
US8799882B2 (en) * | 2005-12-07 | 2014-08-05 | Microsoft Corporation | Compiler support for optimizing decomposed software transactional memory operations |
US7672983B2 (en) * | 2005-12-19 | 2010-03-02 | Sun Microsystems, Inc. | Method and apparatus for tracking activity of a garbage collector with a plurality of threads that operate concurrently with an application program |
US7631024B2 (en) * | 2006-01-03 | 2009-12-08 | Sun Microsystems, Inc. | Method and apparatus for facilitating mark-sweep garbage collection with reference counting |
US9361137B2 (en) | 2006-03-10 | 2016-06-07 | International Business Machines Corporation | Managing application parameters based on parameter types |
US7739267B2 (en) | 2006-03-10 | 2010-06-15 | International Business Machines Corporation | Classification and sequencing of mixed data flows |
US7467278B2 (en) * | 2006-05-08 | 2008-12-16 | International Business Machines Corporation | Memory tuning for garbage collection and central processing (CPU) utilization optimization |
JP2007328692A (ja) | 2006-06-09 | 2007-12-20 | Canon Inc | 代数演算方法及びその装置、プログラム |
US20090307292A1 (en) * | 2006-09-26 | 2009-12-10 | Xiaofeng Li | Dynamically changing a garbage collector in a managed runtime system |
US8825718B2 (en) * | 2006-12-28 | 2014-09-02 | Oracle America, Inc. | Methods and apparatus for marking objects for garbage collection in an object-based memory system |
US8219518B2 (en) | 2007-01-09 | 2012-07-10 | International Business Machines Corporation | Method and apparatus for modelling data exchange in a data flow of an extract, transform, and load (ETL) process |
US8001336B2 (en) * | 2007-03-02 | 2011-08-16 | International Business Machines Corporation | Deterministic memory management in a computing environment |
JP5064134B2 (ja) | 2007-08-03 | 2012-10-31 | 株式会社日立製作所 | メモリ管理方法およびその方法を用いるコンピュータ |
JP5133649B2 (ja) * | 2007-10-16 | 2013-01-30 | 京セラドキュメントソリューションズ株式会社 | 電子機器およびメモリ管理プログラム |
US8082399B2 (en) * | 2008-07-31 | 2011-12-20 | International Business Machines Corporation | Cache bounded reference counting |
JP5153539B2 (ja) * | 2008-09-22 | 2013-02-27 | 株式会社日立製作所 | メモリ管理方法およびその方法を用いるコンピュータ |
JP2011134202A (ja) | 2009-12-25 | 2011-07-07 | Internatl Business Mach Corp <Ibm> | メモリ管理装置、メモリ管理方法、及びメモリ管理プログラム |
JP5380695B2 (ja) * | 2010-02-23 | 2014-01-08 | 株式会社日立製作所 | メモリ管理方法、計算機システム及びメモリ管理プログラム |
WO2011104889A1 (ja) * | 2010-02-25 | 2011-09-01 | 株式会社日立製作所 | 計算機システム、メモリ管理方法及びメモリ管理プログラム |
US8327109B2 (en) * | 2010-03-02 | 2012-12-04 | Advanced Micro Devices, Inc. | GPU support for garbage collection |
US20120216015A1 (en) * | 2011-02-22 | 2012-08-23 | Mitra Sumanranjan S | System and method to concurrently execute a plurality of object oriented platform independent programs by utilizing memory accessible by both a processor and a co-processor |
WO2013128492A1 (ja) * | 2012-03-02 | 2013-09-06 | 株式会社日立製作所 | 計算機、プログラム及びメモリ管理方法 |
JP5564540B2 (ja) * | 2012-08-08 | 2014-07-30 | 株式会社日立製作所 | メモリ管理方法、コンピュータ及びプログラム |
JP5809612B2 (ja) * | 2012-09-10 | 2015-11-11 | 日本電信電話株式会社 | 仮想マシン停止時間予測装置およびプログラム停止時間予測値計算方法 |
US8874535B2 (en) * | 2012-10-16 | 2014-10-28 | International Business Machines Corporation | Performance of RCU-based searches and updates of cyclic data structures |
US9519615B2 (en) * | 2013-04-09 | 2016-12-13 | Emc Corporation | Multiprocessor system with independent direct access to bulk solid state memory resources |
US9361224B2 (en) | 2013-09-04 | 2016-06-07 | Red Hat, Inc. | Non-intrusive storage of garbage collector-specific management data |
JP5756549B2 (ja) * | 2014-06-16 | 2015-07-29 | 株式会社日立製作所 | 記憶領域管理方法、計算機システム及びプログラム |
US9852046B1 (en) * | 2015-05-07 | 2017-12-26 | Cadence Design Systems, Inc. | Method and system for automated debugging memory allocation and memory release |
CN108140100B (zh) * | 2015-10-28 | 2021-10-08 | 赫尔实验室有限公司 | 维护对象的安全标签和引用计数的系统、方法和介质 |
US20190253357A1 (en) * | 2018-10-15 | 2019-08-15 | Intel Corporation | Load balancing based on packet processing loads |
Family Cites Families (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6098089A (en) | 1997-04-23 | 2000-08-01 | Sun Microsystems, Inc. | Generation isolation system and method for garbage collection |
US5930807A (en) | 1997-04-23 | 1999-07-27 | Sun Microsystems | Apparatus and method for fast filtering read and write barrier operations in garbage collection system |
US5845298A (en) | 1997-04-23 | 1998-12-01 | Sun Microsystems, Inc. | Write barrier system and method for trapping garbage collection page boundary crossing pointer stores |
US5953736A (en) | 1997-04-23 | 1999-09-14 | Sun Microsystems, Inc. | Write barrier system and method including pointer-specific instruction variant replacement mechanism |
US5873104A (en) * | 1997-06-26 | 1999-02-16 | Sun Microsystems, Inc. | Bounded-pause time garbage collection system and method including write barrier associated with source and target instances of a partially relocated object |
US6105040A (en) * | 1997-06-30 | 2000-08-15 | Sun Microsystems, Inc. | Method and apparatus for managing stored objects |
US6081665A (en) * | 1997-12-19 | 2000-06-27 | Newmonics Inc. | Method for efficient soft real-time execution of portable byte code computer programs |
US6308185B1 (en) * | 1998-03-06 | 2001-10-23 | Sun Microsystems, Inc. | Methods and apparatus for generational dynamic management of computer memory |
US6317756B1 (en) | 1998-10-07 | 2001-11-13 | International Business Machines Corporation | On-the-fly garbage collector |
US6931423B2 (en) * | 1999-02-11 | 2005-08-16 | Oracle International Corp. | Write-barrier maintenance in a garbage collector |
US6769116B1 (en) * | 1999-10-21 | 2004-07-27 | Oracle International Corporation | Diagnostic technique for debugging memory corruption |
US6226653B1 (en) | 2000-01-10 | 2001-05-01 | International Business Machines Corporation | Method and apparatus for performing generational garbage collection using remembered set counter |
-
2001
- 2001-12-14 JP JP2001382148A patent/JP3939975B2/ja not_active Expired - Lifetime
-
2002
- 2002-12-10 EP EP02258489A patent/EP1320034A3/en not_active Withdrawn
- 2002-12-12 US US10/317,672 patent/US6839726B2/en not_active Expired - Lifetime
- 2002-12-13 CN CNB021542465A patent/CN1280730C/zh not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
EP1320034A2 (en) | 2003-06-18 |
US6839726B2 (en) | 2005-01-04 |
JP3939975B2 (ja) | 2007-07-04 |
EP1320034A3 (en) | 2007-11-21 |
CN1432919A (zh) | 2003-07-30 |
JP2003186737A (ja) | 2003-07-04 |
US20030140071A1 (en) | 2003-07-24 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN1280730C (zh) | 不用存储单元收集装置及不用存储单元收集方法 | |
CN1107911C (zh) | 文件管理装置和方法 | |
CN100336352C (zh) | 内容发布系统、描述数据发布设备和内容发布方法 | |
CN1427335A (zh) | 电路组控制系统 | |
CN1498367A (zh) | 信息处理装置、存储器管理装置、存储器管理方法及信息处理方法 | |
CN1126053C (zh) | 文件检索方法、文件检索发送方法及装置 | |
CN1673965A (zh) | 实时可调度性确定方法和实时系统 | |
CN1645336A (zh) | 基于模板的异构日志信息自动提取与分析方法 | |
CN1875345A (zh) | 在编译过程中表示和检查程序组件的一致性的可扩展类型系统 | |
CN1530855A (zh) | 布局系统和布局程序以及布局方法 | |
CN1573656A (zh) | 并行处理系统中的电源管理系统及电源管理程序 | |
CN1447261A (zh) | 特定要素、字符串向量生成及相似性计算的装置、方法 | |
CN1977531A (zh) | 程序生成装置、程序测试装置、程序执行装置及信息处理系统 | |
CN1577316A (zh) | 单处理器操作系统并行处理系统中的安全管理系统 | |
CN1530856A (zh) | 布局系统和布局程序以及布局方法 | |
CN101030138A (zh) | 应用构架 | |
CN1681287A (zh) | 数字照相机、像簿管理方法、像簿管理程序产品、以及像簿管理程序传送介质 | |
CN1776621A (zh) | 程序变换方法 | |
CN1205548C (zh) | 监视和控制系统 | |
CN1384454A (zh) | 信息概括系统和信息概括方法 | |
CN1599445A (zh) | 数据处理方法、数据处理装置 | |
CN1940939A (zh) | 信息管理设备、信息管理系统和计算机可用介质 | |
CN1066517A (zh) | 说明用户接口的方法及运行多用户接口型计算机的编程系统 | |
CN1237731A (zh) | 数据处理方法、记录介质及数据处理设备 | |
CN1928904A (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 |
Granted publication date: 20061018 Termination date: 20191213 |
|
CF01 | Termination of patent right due to non-payment of annual fee |