CN100530140C - 应用程序级的内存管理方法 - Google Patents
应用程序级的内存管理方法 Download PDFInfo
- Publication number
- CN100530140C CN100530140C CNB2007101692743A CN200710169274A CN100530140C CN 100530140 C CN100530140 C CN 100530140C CN B2007101692743 A CNB2007101692743 A CN B2007101692743A CN 200710169274 A CN200710169274 A CN 200710169274A CN 100530140 C CN100530140 C CN 100530140C
- Authority
- CN
- China
- Prior art keywords
- data structure
- memory
- size
- fixed size
- distribution
- 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
Landscapes
- Memory System (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开一种应用程序级的内存管理方法,包括对固定大小数据结构和可变大小数据结构的内存空间的管理,其管理方法包括:采用池式内存管理的方式管理固定大小数据结构的内存空间的分配和释放,采用垃圾回收机制回收固定大小数据结构内存空间的分配和释放过程中产生的内存碎片;采用矢量方式管理可变大小数据结构的内存空间的分配和释放,采用压缩机制回收可变大小数据结构内存空间的分配和释放过程中产生的内存碎片。通过本发明方案提高了内存分配和释放过程的管理效率,不会消耗尽系统的内存而导致死机;比系统的内存管理更加高效。
Description
技术领域
本发明涉及内存管理技术,特别是指一种应用程序级的内存管理方法。
背景技术
在嵌入式系统中,由于总的可用内存相对比较小,而浏览器(browser)的正常运行需要比较大的内存并且内存分配和释放频繁,例如,一张赏心悦目的网页中存在着各种长短不一的文字段、各种表单(Form)以及各种图片等等,通过几种矩形数据结构(box)来表示它们。在排版过程中,随着上下文的改变,这几种矩形数据结构会进行频繁的分配释放,例如把图片插入到网页的时候,网页会把一个局部区域内的矩形数据结构释放然后重新生成,从内存管理角度来看,这导致了频繁的内存分配和释放。为了保证浏览器的正常运行和减小内部碎片,有必要对应用程序浏览器进行内存管理。
发明内容
有鉴于此,本发明提出一种应用程序级的内存管理方法,提高内存分配和释放过程的管理效率。
基于上述目的本发明提供的一种应用程序级的内存管理方法,包括对固定大小数据结构和可变大小数据结构的内存空间的管理,其管理方法包括:
采用池式内存管理的方式管理固定大小数据结构的内存空间的分配和释放,采用垃圾回收机制回收固定大小数据结构内存空间的分配和释放过程中产生的内存碎片;
采用矢量方式管理可变大小数据结构的内存空间的分配和释放,采用压缩机制回收可变大小数据结构内存空间的分配和释放过程中产生的内存碎片。
该方法所述固定大小数据结构内存空间的分配过程包括:为每种固定大小的数据结构对象分别建立一个对象池,各种对象池组成一个池链表(pool linked list);为所述固定大小的数据结构对象分配一个固定大小的内存块(arena)并按对象大小对这内存块进行格式化。
该方法所述对固定大小的内存块格式化后还包括:将该固定大小的数据结构对象的GCThing数据结构中的flagp指针指向对应的标志位,并把该标志位设置为正在使用,将该对象可用空间的首地址返回给用户,将对象池中freeListHead指针指向下一个对象可用空间的首地址。
该方法所述分配过程前进一步包括:判断当前分配是否为首次分配,如果是,为这个矩形数据结构对象建立一个对象池头,并挂到池链表中;如果不是则直接执行所述分配过程。
该方法如果不是,则进一步查看是否存在一个可用对象空间,如果有,将对象的GCThing数据结构中的flagp指针指向对应的标志位,并把标志位置为正在使用;否则,对挂在该对象池中的所有内存块进行垃圾回收。
该方法所述固定大小数据结构内存空间的释放过程包括:根据分配时返回的首地址找到相应GCThing数据结构中的flagp指针,此指针指向一个标志位,把这个标志位设为已经废弃不用。
该方法所述固定大小数据结构为矩形数据结构。
该方法所述垃圾回收过程为对挂在此对象池中的所有固定大小的内存块进行垃圾回收,回收的可用对象通过链表的形式挂到freeListHead指针下。
该方法如果垃圾回收后发现在这个池中已经没有可用空间,则再动态分配一个固定大小的内存块给这个池,其中每次分配的内存块大小都是固定的。
该方法采用位图与垃圾回收机制结合来重用在固定大小的内存块中已被用户废弃的内存空间。
该方法所述可变大小数据结构内存空间的分配和释放过程包括:从索引缓存中取得一个索引值,并把此索引值放到将要分配给使用者的内存的最后位置;
设置矢量(Vector)数据结构中的各值,在其内记录了分配次数、已分配内存的总大小和下一次分配的起始位置;
设置对应的对象表结构中的各值,把其内的标志位置为正在使用,地址置为当前可用地址,大小置为使用者请求分配内存的大小;返回索引值给使用者。
该方法所述采用压缩机制回收可变大小数据结构内存空间的分配和释放过程中产生的内存碎片过程包括:在对象表中检测各StrMap数据结构的标志位是已经废弃不用还是正在使用,如果标志位是已经废弃不用,那么更改这个标志位为已经回收并继续检测下一个StrMap数据结构的标志位,直到找到一个标志位是正在使用的StrMap数据结构,然后把这个StrMap数据结构对应的内存中的内容移到前面已经废弃不用的内存中,并更改这个StrMap数据结构的成员变量addr的值为新值,重复这个过程,直到把对象表中的所有StrMap数据结构检测完。
从上面所述可以看出,本发明提出应用程序级的内存管理方法,采用池式内存管理的方式管理固定大小数据结构的内存空间的分配和释放,由于会根据需要而动态增长,因此不用预测内存池的大小;由于内存管理器减少了存储每一个对象需要的一个表头大小,并且减少了碎片,池式内存管理能够在较少内存中存储更多对象,减少系统的整体内存需求。同时,通过一个具有垃圾回收机制的可动态增长的内存池来容纳一类小型结构对象,使这些小型结构对象在内存中紧密排列,因而可以循环使用池内空间,且降低分页系统中的分页频率及其带来的额外开销。由于实现的分配和释放函数性能很好,因而提高了时间效率和实时响应能力。
采用矢量方式管理可变大小数据结构的内存空间的分配和释放,采用压缩(Compaction)机制回收可变大小数据结构内存空间的分配和释放过程中产生的内存碎片。利用具有压缩机制的矢量方式通过移动“继续在用对象”来移除“继续在用对象”之间的“已经废弃不用的对象”,从而把“继续在用对象”移成连续排列,而“已经废弃不用的所有对象”所占用的空间解放出来放到地址空间的某一端,对它们进行循环使用。减少了内存碎片,避免了内存空间的浪费。
综上,通过本发明方案提高了内存分配和释放过程的管理效率,不会消耗尽系统的内存而导致死机;比系统的内存管理更加高效。
附图说明
图1为本发明实施例浏览器内存管理各分区的布局;
图2为本发明实施例具有垃圾回收机制的可动态增长的池式内存管理的数据结构示意图;
图3为本发明实施例矢量方式的数据结构示意图;
图4为本发明实施例固定大小数据结构内存空间的分配和释放的流程示意图;
图5为本发明实施例可变大小数据结构内存空间的分配和释放的流程示意图。
具体实施方式
下面参照附图对本发明进行更全面的描述,其中说明本发明的示例性实施例。
本发明是一种应用程序级的内存管理方案,内部提供了两套内存管理机制,分别是:
采用池式内存管理(Pooled Memory Management)的方式来管理固定大小数据结构的分配和释放,采用垃圾回收机制回收其内存碎片;
采用矢量方式来管理可变大小数据结构的分配和释放,比如字符串,采用压缩机制回收其内存碎片。
下面结合具体实施例进行详细说明:
应用程序浏览器内存管理是在一块已分配的内存上进行再组织内存的使用方式,它不会涉及操作系统的内存管理。
首先从系统获得一块固定大小的内存,然后把这块内存按照功能进行固定分区。
参见图1所示,图1是浏览器内存管理各分区的布局,把从系统获得的内存分为四个区:
第一个区是静态区(Static Section),大小为20K,这个区主要包括:用于保存全局性数据结构(GlobalCtlVar)的全局变量区(GlobalVariables Section)、50个字(word)大小的索引缓存(IndicesBuffer)、池链表(Pool Linked List),另外预留了一些空闲区域(FreeArea)。
第二个区是字串映射区(String Map Section),是一个对象表,大小为20K,用于存放数据结构StrMap类型的数组,预定义数组大小为1000,String Map功能之一类似于位图(bitmap),用于管理空闲的数据块。
第三个区是保留区(Reserve Section),大小是20K。
第四个区是可用空间区(Available Section),真正分配给用户的内存从这个区取出。有关池的分配从上到下,有关矢量方式的分配从下到上。
本发明实施例中,对于固定大小数据结构的分配和释放采用具有垃圾回收机制的可动态增长的池式内存管理。
与传统固定大小的内存池技术相比,本发明引入了具有垃圾回收机制的可动态增长的池式内存管理,其数据结构如图2所示。
链表头数据结构由isShift、searchPoolCounter、next和funcpointers各成员组成。isShift用于标志池式链表有没有动态调整过,调整是按每个池的使用频率进行排序,使用频率高的在前,这样可以减少搜索到对应池的平均时间;searchPoolCounter用于统计搜索池的次数;next指向池头结构;func pointers用于注册一些函数的指针。
池头数据结构由boxStru ctSize、boxPool、freeListHead、boxUsedSize、arenaUsedSize、maxBytes、frequency、mark和next成员组成。boxStructSize是一个数值,表示这个池只能用于给boxStructSize大小的数据结构分配内存空间;boxPool的类型是ArenaPool数据结构,用于管理这个池内的所有内存块;freeListHead指向池中当前可用于分配的一块空间;boxUsedSize用于记录已经分配的空间总大小;arenaUsedSize用于记录分配给内存块的空间总大小;maxBytes表示用于这个池的目前最大空间;frequency用于记录从这个池中分配内存的总次数;mark用于标志这个池是否在使用;next指向一个池。
内存块数据结构由next、base、limit、usedLimit、avail和split成员组成。next指向下一个内存块结构;base记录了当前内存块中第一个可用地址;limit记录了当前内存块的最后位置;usedLimit记录了当前内存块的可用空间的最后位置;avail指向当前内存块中下一个用于分配的地址;split指向当前内存块中标志区的最后位置。
这样做的好处是:由于会根据需要而动态增长,因此不用预测内存池的大小;由于具有垃圾回收机制,因此可以循环使用池内空间。
采用可动态增长的池式内存管理:
浏览器使用多种矩形数据结构对象,并经常对它们进行分配和释放,但现有技术的内存管理器会为每一个对象存储一个表头(header),对小对象而言这些表头可能会使程序的内存需求加倍,此外,在一个共享的堆(heap)中分配和释放小对象,会带来碎片风险,并因大量动态对象而增加管理时间。
因此,本发明实施例对每种分配和释放频繁的矩形数据结构对象分别建立一个对象池,各种对象池组成一个池链表(pool linked list)。一个对象池首先预先分配一个固定大小的内存块并按对象大小对其进行格式化;当用完一个固定大小的内存块的最后一个对象时,对当前的池进行垃圾回收处理,把回收的空间放入这个池的空闲链表(free linkedlist)当中,用户可以重用空闲链表中的空间;如果垃圾回收后发现在这个池中已经没有可用空间,则再动态分配一个固定大小的内存块给这个池,其中每次分配的内存块大小都是固定的。从这种池式内存管理的过程来看,对固定大小的内存块的分配采用了动态分区方式,对固定大小的内存块中结构对象的分配采用了固定分区方式。
其中,本实施例中所述池链表的表头用GCThing数据结构来描述,GCThing由next指针、flagp指针组成。这里GCThing是声明一个结构体类型时的结构体名;next指针是GCThing结构体的一个成员,其指向另外一个GCThing结构体或为空;flagp指针是GCThing结构体的一个成员,其指向标志区的一个标志位;freeListHead指针是池头结构体的一个成员,其指向由所有空闲对象组成的空闲链表的首地址。
以上这样做的好处是:由于内存管理器减少了存储每一个对象需要的一个表头大小,并且减少了碎片,池式内存管理能够在较少内存中存储更多对象,减少系统的整体内存需求。同时,通过一个具有垃圾回收机制的可动态增长的内存池来容纳一类小型结构对象,使这些小型结构对象在内存中紧密排列,因而降低分页系统中的分页频率及其带来的额外开销。由于实现的分配和释放函数性能很好,因而提高了时间效率和实时响应能力。
但是,对于每个固定大小的内存块,由于在最后剩余空间不能容纳一个结构对象的大小,那么这块剩余空间就会成内部碎片。当然,求出固定大小的内存块的合理大小,会使内部碎片减少到几个字节,甚至没有内部碎片。特别是每个池的最后一个固定大小的内存块,由于这个固定大小的内存块最有可能没有放满结构对象,因此可能会有比较多的空间浪费。其中,所述求固定大小的内存块合理大小具体可以采用如下方式:对于出现频率比较低的矩形数据结构对象,固定大小的内存块的大小可以取的较小并且其可用空间取矩形数据结构大小与GCThing数据结构大小之和的整数倍;对于出现频率比较高的矩形数据结构对象,固定大小的内存块的大小可以取得较大并且其可用空间取矩形数据结构大小与GCThing数据结构大小之和的整数倍。
为了解决内存碎片问题,本实施例进一步采用位图与垃圾回收机制共同经营回收在固定大小的内存块中已经废弃不用的内存空间。
用户从固定大小的内存块中分配走内存空间,即如图2中标有已分配空间(allocated space)的区域(这块区域由其上面的GCThing数据结构进行管理,GCThing由next指针、flagp指针组成),当用户用完这块内存空间时,对应用程序级的内存管理采用位图与垃圾回收机制结合来重用在固定大小的内存块中已被用户废弃不用的内存空间。
在图2中的标志区(FLAG SECTION)其本质上是一个位图,在标志区中最小的单位是一个字节而不是一个位,在标志区中每一个标志位(flag)都与一个按存放结构大小进行格式化后的内存区域相对应,在图2中用GCThing数据结构中的flagp指针指向标志区中与其相对应标志位,用一个字节大小的标志位来表示其相对应的内存区域是正在使用,还是已经废弃不用,或是已经回收。
用户通过本实施例的内存管理器获得一块内存区域,内存管理器把相对应的标志位置为正在使用;用户通过内存管理器释放分配给它的内存区域,内存管理器把相对应的标志位置为已经废弃不用;内存管理器回收标志位标志为已经废弃不用的内存区域,把回收的内存区域通过GCThing数据结构挂到以freeListHead为头指针的空闲块链表中,如图2所示,从而达到了废弃内存区域的循环使用。
参见图4所示,下面以为一个矩形数据结构分配一块内存空间的过程为例,对可动态增长的池式内存管理过程进行举例说明。
步骤401~402,判断是否为首次分配,如果是首次分配,为这个矩形数据结构对象建立一个对象池头,并挂到池链表(pool linked list)中,进入步骤403;如果不是首次分配的情况,进入步骤408。
所述将对象池头挂到池链表的过程包括:首先找到池链表的最后位置的next指针,然后把此对象池头的首地址赋给这个next指针。
步骤403~404,为该矩形数据结构对象分配一个固定大小的内存块并挂到刚建立的对象池中;按对象大小(对象大小由表头GCThing数据结构大小与矩形数据结构的大小组成)对固定大小的内存块进行格式化。
步骤405~406,格式化完成之后,把第一个对象的GCThing数据结构中的flagp指针指向标志区中对应的标志位,并把该标志位设为正在使用,然后把第一个对象的可用空间的首地址返回给用户。
步骤407,将对象池中freeListHead指针指向第二个对象可用空间的首地址。
步骤408,如果不是首次分配,找到这个矩形数据结构相应的对象池。
步骤409~411,通过freeListHead指针查看是否存在一个可用的对象空间,如果存在,将该矩形数据结构对应的GCThing数据结构中的flagp指针指向对应的标志位,并把标志位设为正在使用,并把此对象的可用空间首地址返回给用户,然后更新freeListHead指针,结束;如果不存在,进入步骤412。
步骤412,对挂在此对象池中的所有固定大小的内存块进行垃圾回收,回收的可用对象通过链表的形式挂到freeListHead指针下。
步骤413~415,判断垃圾回收后,通过freeListHead指针是否至少有一个可用对象,如果是,那么设置freeListHead指针指向的第一个可用对象相应的标志位为正在使用,然后把此对象的可用空间的首地址返回给用户;否则(即如果垃圾回收后,没有发现一个可用对象)进入步骤416。
步骤416~418,为这个矩形数据结构对象分配一个固定大小的内存块并挂到刚建立的对象池中,并按对象大小(表头GCThing数据结构大小与矩形数据结构的大小组成)对固定大小的内存块进行格式化,格式化完成之后,把第一个对象的GCThing数据结构中的flagp指针指向相应标志位,并把标志位设为正在使用,然后把第一个对象的可用空的首地址返回给用户。
当释放一个矩形数据结构所占用的内存空间的时候,根据分配时返回的首地址找到相应GCThing数据结构中的flagp指针,此指针指向一个标志位,把这个标志位设为已经废弃不用,这样就表示这块内存空间可以再次利用。但是当前还不能使用,只有经过垃圾回收才可以使用。当通过freeListHead指针发现没有一个可用对象空间的时候,就要执行垃圾回收,其过程如下:检测各个对象的标志位是不是置为已经废弃不用,如果已经废弃不用,把这块对象挂入freeListHead指针所指向的链表,并把标志位置为已经回收。
另外,使用者也也可以主动调用垃圾回收函数执行垃圾回收过程。
对于可变大小数据结构的分配和释放采用具有压缩机制的矢量结构。
在浏览器中,除了结构大小固定的对象频繁分配和释放外,经常有大量大小不同的对象分配和释放,目前,这种现象主要出现在处理TextBox这一块内容上,这些大小不同的对象具有如下特点:其一是对象的分配和释放是随机发生的;其二是对象可以在其生命过程中改变自身大小。如果直接利用系统函数进行分配和释放,在总内存比较小的嵌入式系统中,会造成过多的碎片,从而浪费了大量内存空间。
本发明实施例采用具有压缩机制的矢量,通过移动“继续在用对象”来移除“继续在用对象”之间的“已经废弃不用的对象”,从而把“继续在用对象”移成连续排列,而“已经废弃不用的所有对象”所占用的空间解放出来放到地址空间的某一端,对它们进行循环使用。
矢量的数据结构如图3:
索引缓存(Index Buffer):存放索引值,索引值的最大个数是预先设置的,用完所有索引值后,可以动态增加索引缓存的大小,从而获得更多的可用索引值;
对象表(Object Table):由StrMap数据结构组成。StrMap数据结构由下列成员变量组成:成员变量mark用于标记相应的内存是正在使用,或者已经废弃不用,或者已经回收,size表示与这个StrMap相对应的已分配内存的大小,addr表示与这个StrMap相对应的已分配内存的首地址。
矢量结构(Vector Structure):用于记录管理可变大小数据结构的分配和释放的一些参数。成员变量elementNum用于记录当前分配内存的次数,clearNum用于记录已经释放内存的次数,index等于最大的索引值个数,totalUsed用于记录已使用内存的大小,vectorLen记录用于可变大小数据结构的总内存大小,pNum指向索引缓存(IndexBuffer)的首地址,pCurrNum指向索引缓存(Index Buffer)的当前可用地址,pLastNum指向索引缓存(Index Buffer)的最后地址,hasIndex表示在索引缓存(Index Buffer)中是否还有可用索引值,pStrMap指向对象表的首地址,pLastSearchPos指向对象表的最后搜索的位置,pLastIndex指向对象表的最后地址,pEndAlloc指向用于可变大小数据结构的内存的最后位置,pCurrAlloc指向在可变大小数据结构的内存中当前可用位置,注册回调函数部分是指把一些相关的函数指针存放在这里。
下面对可变大小数据结构的分配和释放过程进行举例说明。
分配过程中,使用者调用可变大小数据结构的分配函数,分配函数的参数是使用者请求分配内存的大小。
步骤501,首先从索引缓存中取得一个索引值,并把此索引值放到将要分配给使用者的内存的最后位置。
步骤502,更新矢量结构中的各值,在其内记录分配次数、已分配内存的总大小和下一次分配的起始位置。
步骤503,设置对应的对象表结构中的各值,把其内的标志位置为已使用,地址置为当前可用地址,大小置为使用者请求分配内存的大小。
步骤504,最后返回索引值给使用者。使用者通过此索引值得到分配获得的内存地址。
当需要释放内存空间的时候,使用者调用可变大小数据结构的释放函数释放已分配的内存空间,释放函数的参数是索引值。释放函数所做的事情仅是把此索引值对应的对象表(字串映射)中的标志位置为已经废弃不用。
如果可用空间已经不足,则会对用于可变大小数据结构的空间执行压缩操作,具体过程如下:在对象表中从第一个StrMap数据结构开始,检测其对应的标志位是已经废弃不用还是正在使用,如果标志位是已经废弃不用,那么更改这个标志位为已经回收并继续检测下一个StrMap数据结构的标志位,直到找到一个标志位是正在使用的StrMap数据结构,然后把这个StrMap数据结构对应的内存中的内容移到前面已经废弃不用的内存中,并更改这个StrMap数据结构的成员变量addr的值为新值,重复这个过程,直到把对象表中的所有StrMap数据结构检测完。执行压缩之后,把所有正在使用的空间连成一片,没有使用的空间也连成一片。这时索引值对应的内存地址发生改变,但是返回给使用者的索引值不变,因此使用者要通过索引值得到分配获得的内存地址。
以上实施倒是针对嵌入式浏览器的内存管理描述的,本发明也可以应用于其他场合的应用程序级的内存管理,特别是对固定大小数据结构种类较少(比如10种以下)的情况具有很好的效果。
本发明的描述是为了示例和描述起见而给出的,而并不是无遗漏的或者将本发明限于所公开的形式。很多修改和变化对于本领域的普通技术人员而言是显然的。选择和描述实施例是为了更好说明本发明的原理和实际应用,并且使本领域的普通技术人员能够理解本发明从而设计适于特定用途的带有各种修改的各种实施例。
Claims (11)
1.一种应用程序级的内存管理方法,包括对固定大小数据结构和可变大小数据结构的内存空间的管理,其特征在于,包括:
采用池式内存管理的方式管理固定大小数据结构的内存空间的分配和释放,采用垃圾回收机制回收固定大小数据结构内存空间的分配和释放过程中产生的内存碎片;
采用矢量方式管理可变大小数据结构的内存空间的分配和释放,设置包括索引缓存、对象表和矢量结构的矢量数据结构,其中所述矢量结构用于记录管理可变大小数据结构的分配和释放参数;当需要分配内存的时候,从索引缓存中取得一个索引值,并把此索引值放到将要分配给使用者的内存的最后位置;更新矢量结构中的各值,在其内记录了分配次数、已分配内存的总大小和下一次分配的起始位置;设置对应的对象表中的各值,把其内的标志位置为正在使用,地址置为当前可用地址,大小置为使用者请求分配内存的大小;返回索引值给使用者;
当需要释放内存空间的时候,使用者调用可变大小数据结构的释放函数释放已分配的内存空间,释放函数的参数是索引值,其中释放函数用于把此索引值对应的对象表中的标志位置为已经废弃不用;
采用压缩机制回收可变大小数据结构内存空间的分配和释放过程中产生的内存碎片,把继续在用对象移成连续排列,而已经废弃不用的所有对象所占用的空间释放出来放到地址空间的某一端。
2.根据权利要求1所述的方法,其特征在于,所述固定大小数据结构内存空间的分配过程包括:为每种固定大小的数据结构对象分别建立一个对象池,各种对象池组成一个池链表;为所述固定大小的数据结构对象分配一个固定大小的内存块并按对象大小对其进行格式化。
3.根据权利要求2所述的方法,其特征在于,所述对固定大小的内存块格式化后还包括:将该固定大小的数据结构对象的GCThing数据结构中的flagp指针指向对应的标志位,并把该标志位设置为正在使用,将该对象可用空间的首地址返回给用户,将对象池中freeListHead指针指向下一个对象可用空间的首地址。
4.根据权利要求3所述的方法,其特征在于,所述分配过程前进一步包括:判断当前分配是否为首次分配,如果是,为这个固定大小数据结构对象建立一个对象池头,并挂到池链表中;如果不是则直接执行所述分配过程。
5.根据权利要求4所述的方法,其特征在于,在所述判断当前分配是否为首次分配过程时,如果判断为不是,则进一步查看是否存在一个可用对象空间,如果有,将对象的GCThing数据结构中的flagp指针指向对应的标志位,并把标志位置为正在使用;否则,对挂在该对象池中的所有固定大小的内存块进行垃圾回收。
6.根据权利要求3所述的方法,其特征在于,所述固定大小数据结构内存空间的释放过程包括:根据分配时返回的首地址找到相应GCThing数据结构中的flagp指针,此指针指向一个标志位,把这个标志位设为已经废弃不用。
7.根据权利要求1至6任意一项所述的方法,其特征在于,所述固定大小数据结构为矩形数据结构。
8.根据权利要求3至6任意一项所述的方法,其特征在于,所述垃圾回收过程为对挂在此对象池中的所有固定大小的内存块进行垃圾回收,回收的可用对象通过链表的形式挂到freeListHead指针下。
9.根据权利要求8所述的方法,其特征在于,如果垃圾回收后发现在这个池中已经没有可用空间,则再动态分配一个固定大小的内存块给这个池,其中每次分配的内存块大小都是固定的。
10.根据权利要求8所述的方法,其特征在于,采用位图与垃圾回收机制结合来重用在固定大小的内存块中已被用户废弃的内存空间。
11.根据权利要求1所述的方法,其特征在于,所述采用压缩机制回收可变大小数据结构内存空间的分配和释放过程中产生的内存碎片过程包括:在对象表中检测各StrMap数据结构的标志位是已经废弃不用还是正在使用,如果标志位是已经废弃不用,那么更改这个标志位为已经回收并继续检测下一个StrMap数据结构的标志位,直到找到一个标志位是正在使用的StrMap数据结构,然后把这个StrMap数据结构对应的内存中的内容移到前面已经废弃不用的内存中,并更改这个StrMap数据结构的成员变量addr的值为新值,重复这个过程,直到把对象表中的所有StrMap数据结构检测完,其中所述addr表示与这个StrMap数据结构相对应的已分配内存的首地址。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB2007101692743A CN100530140C (zh) | 2007-11-08 | 2007-11-08 | 应用程序级的内存管理方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB2007101692743A CN100530140C (zh) | 2007-11-08 | 2007-11-08 | 应用程序级的内存管理方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101169759A CN101169759A (zh) | 2008-04-30 |
CN100530140C true CN100530140C (zh) | 2009-08-19 |
Family
ID=39390390
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNB2007101692743A Expired - Fee Related CN100530140C (zh) | 2007-11-08 | 2007-11-08 | 应用程序级的内存管理方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN100530140C (zh) |
Families Citing this family (24)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101859279B (zh) * | 2010-05-21 | 2012-05-09 | 北京星网锐捷网络技术有限公司 | 一种内存分配、释放方法及装置 |
CN101901191A (zh) * | 2010-05-31 | 2010-12-01 | 深圳市茁壮网络股份有限公司 | 嵌入式系统多类内存管理方法及装置 |
CN101847127B (zh) * | 2010-06-18 | 2012-01-25 | 福建星网锐捷网络有限公司 | 一种内存管理方法及装置 |
WO2012149815A1 (zh) * | 2011-11-01 | 2012-11-08 | 华为技术有限公司 | 磁盘缓存的管理方法及装置 |
CN103365782A (zh) * | 2012-03-30 | 2013-10-23 | 上海申通地铁集团有限公司 | 内存管理方法 |
CN103678160B (zh) * | 2012-08-30 | 2017-12-05 | 腾讯科技(深圳)有限公司 | 一种存储数据的方法和装置 |
CN102968380B (zh) * | 2012-11-02 | 2016-12-07 | 深圳市同洲电子股份有限公司 | 内存文件系统中内存分区的管理方法和装置 |
CN103488576B (zh) * | 2013-09-18 | 2016-09-07 | 珠海金山网络游戏科技有限公司 | 一种高性能小区块内存管理方法 |
CN103593300B (zh) * | 2013-11-15 | 2017-05-03 | 浪潮电子信息产业股份有限公司 | 一种内存分配回收方法 |
CN103914265B (zh) * | 2014-04-09 | 2016-11-23 | 江苏物联网研究发展中心 | 集群细粒度内存管理方法 |
CN105204940A (zh) * | 2014-05-28 | 2015-12-30 | 中兴通讯股份有限公司 | 一种内存配置方法和装置 |
CN104090848B (zh) * | 2014-07-16 | 2017-03-08 | 云南大学 | 一种周期性大数据处理的内存管理方法及装置 |
CN104602103A (zh) * | 2014-12-29 | 2015-05-06 | 深圳创维数字技术有限公司 | 一种机顶盒内存分配方法及装置 |
CN105138466A (zh) * | 2015-07-15 | 2015-12-09 | 贵阳朗玛信息技术股份有限公司 | 元素存储方法及装置 |
CN105577568A (zh) * | 2015-12-09 | 2016-05-11 | 美的集团股份有限公司 | Uart的数据处理控制方法及控制装置 |
CN106293939B (zh) * | 2016-08-05 | 2019-10-18 | 北京航空航天大学 | 一种在内存垃圾收集器中动态重用对象的方法 |
CN106293878B (zh) * | 2016-08-05 | 2019-08-27 | 北京航空航天大学 | 一种在jvm中动态计算对象重用价值的方法 |
CN106250242A (zh) * | 2016-08-10 | 2016-12-21 | 西安诺瓦电子科技有限公司 | 基于操作系统的内存复用方法及装置 |
CN106648780A (zh) * | 2016-12-26 | 2017-05-10 | 努比亚技术有限公司 | 电子设备及应用处理方法 |
CN106604043A (zh) * | 2016-12-30 | 2017-04-26 | Ut斯达康(深圳)技术有限公司 | 一种互联网直播方法及直播服务器 |
CN107656703A (zh) * | 2017-09-28 | 2018-02-02 | 郑州云海信息技术有限公司 | 一种空闲block查询的方法及系统 |
CN108984310A (zh) * | 2018-08-21 | 2018-12-11 | 郑州云海信息技术有限公司 | 一种对象数据的构建方法和装置 |
CN110674053B (zh) * | 2019-09-30 | 2021-09-14 | 深圳忆联信息系统有限公司 | Ssd数据存储节点管理方法、装置、计算机设备及存储介质 |
CN113011150B (zh) * | 2021-03-19 | 2023-03-31 | 重庆重报印务有限公司 | 一种报纸的排版系统及方法 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6505283B1 (en) * | 1998-10-06 | 2003-01-07 | Canon Kabushiki Kaisha | Efficient memory allocator utilizing a dual free-list structure |
JP2004348766A (ja) * | 2004-08-12 | 2004-12-09 | Seiko Epson Corp | メモリ管理装置、プロキシサーバ、メモリ管理プログラム及びサーバ用プログラム、並びにメモリ管理方法 |
CN1722106A (zh) * | 2004-07-13 | 2006-01-18 | 中兴通讯股份有限公司 | 一种嵌入式实时操作系统中内存分配的方法 |
CN1740975A (zh) * | 2005-09-16 | 2006-03-01 | 浙江大学 | 解决频繁分配释放同等大小内存的方法 |
-
2007
- 2007-11-08 CN CNB2007101692743A patent/CN100530140C/zh not_active Expired - Fee Related
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6505283B1 (en) * | 1998-10-06 | 2003-01-07 | Canon Kabushiki Kaisha | Efficient memory allocator utilizing a dual free-list structure |
CN1722106A (zh) * | 2004-07-13 | 2006-01-18 | 中兴通讯股份有限公司 | 一种嵌入式实时操作系统中内存分配的方法 |
JP2004348766A (ja) * | 2004-08-12 | 2004-12-09 | Seiko Epson Corp | メモリ管理装置、プロキシサーバ、メモリ管理プログラム及びサーバ用プログラム、並びにメモリ管理方法 |
CN1740975A (zh) * | 2005-09-16 | 2006-03-01 | 浙江大学 | 解决频繁分配释放同等大小内存的方法 |
Also Published As
Publication number | Publication date |
---|---|
CN101169759A (zh) | 2008-04-30 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN100530140C (zh) | 应用程序级的内存管理方法 | |
CN108038002B (zh) | 一种嵌入式软件内存管理方法 | |
CN108132842B (zh) | 一种嵌入式软件内存管理系统 | |
US4660130A (en) | Method for managing virtual memory to separate active and stable memory blocks | |
US4758944A (en) | Method for managing virtual memory to separate active and stable memory blocks | |
US6928460B2 (en) | Method and apparatus for performing generational garbage collection in a segmented heap | |
US6505283B1 (en) | Efficient memory allocator utilizing a dual free-list structure | |
EP3504628B1 (en) | Memory management method and device | |
JP3611305B2 (ja) | 永続的且つロバストな記憶割当てシステム及び方法 | |
US8321638B2 (en) | Cooperative mechanism for efficient application memory allocation | |
US6105040A (en) | Method and apparatus for managing stored objects | |
CN106294190B (zh) | 一种存储空间管理方法及装置 | |
CN1321377C (zh) | 智能卡存储环境的控制方法 | |
CN101286878B (zh) | 一种终端的内存池的管理方法 | |
US20060236059A1 (en) | System and method of allocating contiguous memory in a data processing system | |
CN112162938B (zh) | 大页内存分配方法及其计算机 | |
CN101984417A (zh) | 内存管理方法及装置 | |
US10108555B2 (en) | Memory system and memory management method thereof | |
CN109815165A (zh) | 用于存储和处理高效压缩高速缓存行的系统和方法 | |
CN105302737A (zh) | 一种内存分配管理方法及系统 | |
US6820183B2 (en) | Methods, systems, and computer program products for memory pool management using variable size sub-pools | |
CN104536773B (zh) | 基于内存扫描的嵌入式软件动态内存回收方法 | |
KR100622114B1 (ko) | 임베디드 시스템에서의 효율적인 동적 메모리 관리방법 및그 시스템 | |
CN101739346B (zh) | 对安全控制模块内存进行集中控制的方法 | |
CN101610197A (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: 20090819 Termination date: 20151108 |
|
EXPY | Termination of patent right or utility model |