一种内存垃圾回收系统及方法

文档序号:6516427阅读:285来源:国知局
一种内存垃圾回收系统及方法
【专利摘要】本发明涉及内存垃圾回收系统及方法,包含垃圾分析模块,记录内存分配和释放信息,查询页表获取物理地址信息,以确定每个数据对象是否存在于内存中,得到该数据对象对应的物理地址空间信息;并将该信息更新到垃圾监控模块中的数据对象监控列表,以确定数据对象对应的物理地址空间信息。垃圾监控模块,用于维护该数据对象监控列表,将新分配的数据对象加入;将删除的数据对象从数据对象监控列表中删除;并监控所有的访存请求,将访存关联到数据对象,更新数据对象的访问信息,并将这些访存请求关联到数据对象监控列表中的数据对象,更新访问信息。垃圾监控模块定期将数据对象访问信息反馈给垃圾分析模块,垃圾分析模块分析根据这些信息负责分析出可疑的内存垃圾块,并在可疑的垃圾块中确定真正的内存垃圾块,高精度低开销回收其内存空间。
【专利说明】一种内存垃圾回收系统及方法
【技术领域】
[0001]本发明涉及计算机内存管理领域,特别涉及一种内存垃圾回收系统及方法。
【背景技术】
[0002]垃圾回收是计算机内存管理领域一个很重要的方面。应用程序为每个数据对象都分配一定的内存空间,内存中不再被程序使用的数据对象所占用的内存空间称为垃圾块。垃圾回收器能够自动回收内存中用不到的垃圾块,从而合理的使用和分配内存,避免因内存垃圾过多而造成的内存泄露等问题。
[0003]垃圾回收的原则是找到程序中不再使用,但是又没有进行释放的数据对象,然后回收这些数据对象所对应的内存资源。
[0004]在Java等类型安全的语言中,采用垃圾回收器(GC),进行垃圾回收。以Java为例,垃圾回收器的回收机制在Java虚拟机(Java Virtual Machine, JVM)中实现,对应用程序透明。Java虚拟机采用堆栈的结构管理内存,数据对象(包括数组)都被分配在堆上,垃圾回收器主要运行在堆上,监控每一个数据对象的运行状态,包括数据对象的申请、引用、被引用、赋值等。
[0005]Mark-Sweep方法是现有垃圾回收技术中使用的比较广泛的一种方法,在这种方法中,内存中的每个数据对象都会保留一个专门用来实现垃圾回收的标记位。Mark-Sweep方法将堆视为一张有向可达图,每个数据对象视为一个堆节点,根目录(Root Set)为程序中的各种变量,这些变量被分配在栈上,根目录中的节点称为根节点,从根节点出发,可以访问到程序中正在使用的全部数据对象,堆上剩余的其它数据对象即为在程序中不能再被使用的数据对象,其对应的内存资源即为垃圾块,可被释放回收。
[0006]Mark-Sweep方法的工作流程如下:
[0007]1、Mark 阶段
[0008]从根节点出发,遍历有向可达图,标记每一个被遍历到的节点(该节点为可达的)所对应数据对象的标记位,表示该数据对象正在被程序使用。
[0009]2、Sweep 阶段
[0010]扫面整个内存,如果数据对象的标记位没有被标记,说明在Mark阶段没有遍历到该节点(该节点为不可达的),该数据对象不再被程序使用,则回收该数据对象所占用的内存空间。如果数据对象的标记位被标记,则重置该标记位。Sweep阶段示意图如图1所示。
[0011]现有垃圾回收器的不足:
[0012]1、若采用Mark-Sweep方法,则需从根节点出发,从上而下的扫描方式,需要扫描程序的整个工作集,而且Swe印阶段需要再次扫描整个内存,开销比较大。
[0013]2、为了提高垃圾回收器的运行速度,减少对应用程序的影响,而且为了保证在垃圾回收器执行过程中不会因数据对象之间引用关系的变化而对垃圾回收器造成影响,很多垃圾回收器采用了 Stop-The-World的工作方式,即在垃圾回收器运行的时候,需要暂停所有的应用程序。这样会对应用程序的性能有较大的影响。[0014]3、在内存数量不足时才触发垃圾回收器进行垃圾回收的操作,此时由于应用程序已运行较长时间,内存中的数据对象数目较多,则需要较长的时间运行来扫描应用程序使用的数据对象,回收大量的垃圾块。

【发明内容】

[0015]为了解决上述问题,本发明的目的在于公开一种内存垃圾回收系统及方法,解决通过纯软件方式进行垃圾回收存在的需要多次访问内存,开销比较大,运行时间较长,而且会对应用程序产生较大影响的问题,提出一种高精度,低开销的内存垃圾回收方法。
[0016]具体地讲,本发明公开了 一种内存垃圾回收系统,包含垃圾监控模块和垃圾分析模块,其中:
[0017]垃圾分析模块,用于记录内存分配和释放信息,查询页表获取物理地址信息,以确定每个数据对象是否存在于内存中,得到该数据对象对应的物理地址空间信息;并将该物理地址空间信息更新到垃圾监控模块中的数据对象监控列表,以确定垃圾监控模块数据对象监控列表中的数据对象对应的物理地址空间信息。
[0018]垃圾监控模块,用于维护该数据对象监控列表,将新分配的数据对象加入到数据对象监控列表;将删除的数据对象从数据对象监控列表中删除;并监控所有的访存请求,将访存关联到数据对象,更新数据对象的访问信息,并将这些访存请求关联到数据对象监控列表中的数据对象,更新这些数据对象的访问信息。
[0019]垃圾监控模块定期将数据对象访问信息反馈给垃圾分析模块,垃圾分析模块分析根据这些信息负责分析出可疑的内存垃圾块,并在可疑的垃圾块中确定真正的内存垃圾块,回收其内存空间。
[0020]所述内存垃圾回收系统的垃圾监控模块,还用于维护每个数据对象物理地址空间信息,进入监控列表的时间和访问时间信息以及维护数据对象的空闲时间计数信息。
[0021]所述内存垃圾回收系统的垃圾分析模块,用于只维护数据对象的分配、释放和引
用信息。
[0022]所述内存垃圾回收系统的垃圾监控模块将数据对象访问信息反馈给垃圾分析模块,垃圾分析模块利用这些数据对象访问信息来先检测出可疑的内存垃圾块,然后在可疑的内存垃圾块中检测真正的内存垃圾块,回收其对应的内存资源,以提高垃圾回收的速度和检测内存垃圾的精度。
[0023]所述内存垃圾回收系统,该数据对象之间的引用采用双向指针。
[0024]所述内存垃圾回收系统的垃圾分析模块监控数据对象的内存分配和释放信息,包括数据对象的指针,起始地址,数据对象的大小和数据对象的创建时间戳信息,然后通过查询页表来将数据对象的虚拟地址信息转换为物理地址信息。
[0025]所述内存垃圾回收系统的垃圾监控模块侦听内存总线上的访存信号,获取该访存的物理地址,然后查询数据对象监控列表,将访存关联到数据对象,如果该访存为第一次访问某个数据对象,则记录该数据对象的第一次访问时间,否则更新数据对象的最后一次访问时间。
[0026]所述内存垃圾回收系统的垃圾监控模块通过访存监控卡或是在内存控制器内部增加逻辑单元实现侦听内存总线上的访存信号。[0027]本发明还公开了一种内存垃圾回收方法,包括如下步骤:
[0028]步骤10、垃圾分析模块记录数据对象的内存分配和释放信息,然后通过查询页表将数据对象的虚拟地址空间信息转换为物理地址空间信息;
[0029]步骤20、垃圾分析模块将查询到的数据对象物理地址空间信息更新到垃圾监控模块的数据对象监控列表中;
[0030]步骤30、垃圾监控模块维护数据对象监控列表,如果是新分配的数据对象,则将其加入到数据对象监控列表中,如果是删除数据对象,则将数据对象从数据对象监控列表中删除;
[0031]步骤40、垃圾监控模块监控所有的访存请求,获取访存请求的物理地址,然后将该访存请求关联到数据对象监控列表中的数据对象,更新数据对象监控列表中数据对象的访问信息;
[0032]步骤50、垃圾监控模块定期将数据对象访问信息反馈给垃圾分析模块件,垃圾分析模块根据这些信息负责分析出可疑的内存垃圾块;
[0033]步骤60、垃圾分析模块确定可疑内存垃圾块中的内存垃圾,回收这些内存资源。
[0034]所述内存垃圾回收方法中,垃圾监控模块将数据对象访问信息反馈给垃圾分析模块,垃圾分析模块利用这些数据对象访问信息来先检测出可疑的内存垃圾块,然后在可疑的内存垃圾块中检测真正的内存垃圾块,回收其对应的内存资源,以提高垃圾回收的速度和检测内存垃圾的精度。
[0035]所述检测出可疑的内存垃圾块包括如下步骤:
[0036]垃圾分析模块根据该数据对象访问信息来分析数据对象最后一次访问到当前时间的时间长度,以及数据对象的最后一次访问和第一次访问的时间间隔,将数据对象的空闲时间较长,或是空闲时间和活动时间的比值超过阈值的数据对象设置为可疑的内存垃圾块。
[0037]所述内存垃圾回收方法,垃圾分析模块监控数据对象的内存分配和释放信息,包括数据对象的指针,起始地址,数据对象的大小和数据对象的创建时间戳信息,然后通过查询页表来将数据对象的虚拟地址信息转换为物理地址信息。
[0038]所述内存垃圾回收方法中,垃圾监控模块侦听内存总线上的访存信号,获取该访存的物理地址,然后查询数据对象监控列表,将访存关联到数据对象,如果该访存为第一次访问某个数据对象,则记录该数据对象的第一次访问时间,否则更新数据对象的最后一次访问时间。
[0039]所述内存垃圾回收方法中,垃圾监控模块通过访存监控卡或是在内存控制器内部增加逻辑单元实现侦听内存总线上的访存信号。
[0040]本发明的技术效果如下:
[0041]本发明使用垃圾分析模块记录数据对象的内存分配和释放信息,并通过查询页表来获得数据对象对应的物理地址空间信息,将该信息更新到垃圾监控模块的监控列表,这样便可获得垃圾监控模块的监控列表中数据对象对应的物理地址空间信息。垃圾监控模块监控所有的访存请求,将该请求关联到数据对象,便可通过监控访存请求来获得数据对象的访问信息,开销低而且可以监控所有的访存请求,获得所有线程数据对象的访问信息。最后垃圾分析模块根据垃圾监控模块返回的数据对象访问信息来探测内存垃圾块,速度块,准确性高,而且不用遍历整个内存和程序的整个工作集。
【专利附图】

【附图说明】
[0042]图1为Sweep阶段示意图
[0043]图2为本发明技术实现方案;
[0044]图3为判断可疑内存垃圾块的策略;
[0045]图4为确定内存垃圾块示意图;
[0046]图5为软硬件结合回收内存垃圾流程图。
【具体实施方式】
[0047]本发明公开的内存垃圾回收系统,该系统包括垃圾监控模块和垃圾分析模块。
[0048]垃圾分析模块记录内存分配和释放信息,查询页表获取物理地址信息,以确定每个数据对象是否存在于内存中,得到该数据对象对应的物理地址空间信息。
[0049]垃圾分析模块将数据对象的物理地址空间信息更新到垃圾监控模块中的数据对象监控列表,以确定垃圾监控模块数据对象监控列表中的数据对象对应的物理地址空间信肩、O
[0050]垃圾监控模块维护数据对象监控列表,将新分配的数据对象加入到数据对象监控列表;将删除的数据对象从数据对象监控列表中删除。对每个数据对象,维护其物理地址空间信息;维护其进入监控列表的时间和访问时间等信息;维护数据对象的空闲时间计数信息,记录数据对象没被访问的时间。
[0051]垃圾监控模块监控所有的访存请求,将访存关联到数据对象,更新数据对象的访问信息。
[0052]垃圾分析模块不再维护数据对象的访问信息,只需维护数据对象的分配、释放和引用信息即可。由垃圾监控模块监控所有的访存请求,然后查询数据对象监控列表,将这些访存请求关联到具体的数据对象,更新这些数据对象的访问信息。
[0053]垃圾监控模块定期将数据对象访问信息反馈给垃圾分析模块,垃圾分析模块负责分析这些数据对象访问信息,根据这些信息首先确定可疑的内存垃圾块,然后在可疑的垃圾块中确定真正的内存垃圾块,回收其内存空间。
[0054]垃圾监控模块将数据对象访问信息反馈给垃圾分析模块,垃圾分析模块利用这些数据对象访问信息来先检测出可疑的内存垃圾块,然后在可疑的内存垃圾块中检测真正的内存垃圾块,回收其对应的内存资源。可以提高垃圾回收的速度和检测内存垃圾的精度,应用程序的执行不会对垃圾回收产生影响,因此不用暂停应用程序的执行;
[0055]数据对象之间的引用采用双向指针,即引用数据对象有指向被引用数据对象的指针,被引用数据对象也有指向引用数据对象的指针。这样可以从堆节点出发,确定一个堆节点是否是可达的,即可以确定一个可疑的内存垃圾块是否是真正的内存垃圾块。
[0056]为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图详细说明。
[0057]本发明的技术实现方案如图2所示:
[0058]垃圾分析模块监控数据对象的内存分配和释放信息,包括数据对象的指针,起始地址(虚拟地址),数据对象的大小和数据对象的创建时间戳等信息,然后通过查询页表来将数据对象的虚拟地址信息转换为物理地址信息。
[0059]垃圾分析模块将数据对象的这些信息更新到垃圾监控模块的数据对象监控列表中,如果是新建数据对象,则将数据对象加入到监控列表中,如果是删除数据对象,则将数据对象从监控列表中删除。通过垃圾监控模块来维护数据对象监控列表,对每个数据对象,需要维护其物理地址空间信息,维护数据对象进入监控列表的时间,最后一次访问时间等其它有助于判断该数据对象是否是内存垃圾块的信息。
[0060]垃圾监控模块侦听内存总线上的访存信号,获取该访存的物理地址,然后查询数据对象监控列表,将访存关联到数据对象,如果该访存为第一次访问某个数据对象,则记录该数据对象的第一次访问时间,否则更新数据对象的最后一次访问时间。侦听访存信号可以通过访存监控卡或是在内存控制器内部增加逻辑单元等方法实现。
[0061]垃圾监控模块将访问信息反馈给垃圾分析模块,垃圾分析模块根据这些信息来分析数据对象最后一次访问到当前时间的时间长度(即数据对象的空闲时间),以及数据对象的最后一次访问和第一次访问的时间间隔(即数据对象的活动时间),将数据对象的空闲时间较长,或是空闲时间和活动时间的比值(即数据对象的空闲限度)超过阈值的数据对象设置为可疑的内存垃圾块(称为Cold-Spot)。
[0062]一种判断可疑内存垃圾块的策略如图3所示,空闲时间的阈值和空闲限度的阈值可以根据情况灵活设定。
[0063]从可疑的内存垃圾块出发,确定这些可疑的内存垃圾块是否是内存垃圾,然后回收确定了的内存垃圾块。
[0064]确定内存垃圾块的策略如图4所示:将存储器视为一张双向可达图,为了实现这个目的,需要将数据对象之间的引用改为双向指针,即如果一个数据对象a引用了另外一个数据对象b时,该数据对象a有一个指向被引用数据对象b的指针,被引用数据对象b也有一个指向引用数据对象a的指针。这样便可以从可疑的内存垃圾块出发,对存储器进行遍历。可以遍历到根节点的节点为可达的(其对应的数据对象为应用程序正在使用的数据对象,不可回收),不能遍历到根节点的节点为不可达的(其对应的数据对象为应用程序不再使用的数据对象,为可回收的内存垃圾块)。最后将可回收的内存垃圾块加入到空闲链表中。
[0065]图5所示是本发明公开的一种内存垃圾回收方法的步骤:
[0066]步骤10、垃圾分析模块记录数据对象的内存分配和释放信息,然后通过查询页表将数据对象的虚拟地址空间信息转换为物理地址空间信息。
[0067]步骤20、垃圾分析模块将查询到的数据对象物理地址空间信息更新到垃圾监控模块的数据对象监控列表中。
[0068]步骤30、垃圾监控模块维护数据对象监控列表,如果是新分配的数据对象,则将其加入到数据对象监控列表中,如果是删除数据对象,则将数据对象从数据对象监控列表中删除。
[0069]步骤40、垃圾监控模块监控所有的访存请求,获取访存请求的物理地址,然后将该访存请求关联到数据对象监控列表中的数据对象,更新数据对象监控列表中数据对象的访问信息。
[0070]步骤50、垃圾监控模块定期将数据对象访问信息反馈给垃圾分析模块件,垃圾分析模块根据这些信息负责分析出可疑的内存垃圾块。
[0071]步骤60、垃圾分析模块确定可疑内存垃圾块中的内存垃圾,回收这些内存资源。
[0072]综上,本发明公开的垃圾回收方法提供垃圾分析模块和垃圾监控模块相结合的方式,实现低开销、运行时间较短的垃圾回收方法。
【权利要求】
1.一种内存垃圾回收系统,其特征在于,包含垃圾监控模块和垃圾分析模块,其中: 垃圾分析模块,用于记录内存分配和释放信息,查询页表获取物理地址信息,以确定每个数据对象是否存在于内存中,得到该数据对象对应的物理地址空间信息;并将该物理地址空间信息更新到垃圾监控模块中的数据对象监控列表,以确定垃圾监控模块数据对象监控列表中的数据对象对应的物理地址空间信息; 垃圾监控模块,用于维护该数据对象监控列表,将新分配的数据对象加入到数据对象监控列表;将删除的数据对象从数据对象监控列表中删除;并监控所有的访存请求,将访存关联到数据对象,更新数据对象的访问信息,并将这些访存请求关联到数据对象监控列表中的数据对象,更新这些数据对象的访问信息。 垃圾监控模块定期将数据对象访问信息反馈给垃圾分析模块,垃圾分析模块分析根据这些信息负责分析出可疑的内存垃圾块,并在可疑的垃圾块中确定真正的内存垃圾块,回收其内存空间。
2.如权利要求1所述内存垃圾回收系统,其特征在于,垃圾监控模块,还用于维护每个数据对象物理地址空间信息,进入监控列表的时间和访问时间信息以及维护数据对象的空闲时间计数信息。
3.如权利要求1所述内存垃圾回收系统,其特征在于,垃圾分析模块,用于只维护数据对象的分配、释放和引用信息。
4.如权利要求1所述内存垃圾回收系统,其特征在于,垃圾监控模块将数据对象访问信息反馈给垃圾分析模块,垃圾分析模块利用这些数据对象访问信息来先检测出可疑的内存垃圾块,然后在可疑的内存垃圾块中检测真正的内存垃圾块,回收其对应的内存资源,以提高垃圾回收的速度和检测内存垃圾的精度。
5.如权利要求1所述内存垃圾回收系统,其特征在于,该数据对象之间的引用采用双向指针。`
6.如权利要求1所述内存垃圾回收系统,其特征在于,垃圾分析模块监控数据对象的内存分配和释放信息,包括数据对象的指针,起始地址,数据对象的大小和数据对象的创建时间戳信息,然后通过查询页表来将数据对象的虚拟地址信息转换为物理地址信息。
7.如权利要求1所述内存垃圾回收系统,其特征在于,垃圾监控模块侦听内存总线上的访存信号,获取该访存的物理地址,然后查询数据对象监控列表,将访存关联到数据对象,如果该访存为第一次访问某个数据对象,则记录该数据对象的第一次访问时间,否则更新数据对象的最后一次访问时间。
8.如权利要求7所述内存垃圾回收系统,其特征在于,垃圾监控模块通过访存监控卡或是在内存控制器内部增加逻辑单元实现侦听内存总线上的访存信号。
9.一种内存垃圾回收方法,其特征在于,包括如下步骤: 步骤10、垃圾分析模块记录数据对象的内存分配和释放信息,然后通过查询页表将数据对象的虚拟地址空间信息转换为物理地址空间信息; 步骤20、垃圾分析模块将查询到的数据对象物理地址空间信息更新到垃圾监控模块的数据对象监控列表中; 步骤30、垃圾监控模块维护数据对象监控列表,如果是新分配的数据对象,则将其加入到数据对象监控列表中,如果是删除数据对象,则将数据对象从数据对象监控列表中删除; 步骤40、垃圾监控模块监控所有的访存请求,获取访存请求的物理地址,然后将该访存请求关联到数据对象监控列表中的数据对象,更新数据对象监控列表中数据对象的访问信息; 步骤50、垃圾监控模块定期将数据对象访问信息反馈给垃圾分析模块件,垃圾分析模块根据这些信息负责分析出可疑的内存垃圾块; 步骤60、垃圾分析模块确定可疑内存垃圾块中的内存垃圾,回收这些内存资源。
10.如权利要求9所述内存垃圾回收方法,其特征在于,垃圾监控模块将数据对象访问信息反馈给垃圾分析模块,垃圾分析模块利用这些数据对象访问信息来先检测出可疑的内存垃圾块,然后在可疑的内存垃圾块中检测真正的内存垃圾块,回收其对应的内存资源,以提高垃圾回收的速度和检测内存垃圾的精度。
11.如权利要求10所述内存垃圾回收方法,其特征在于,所述检测出可疑的内存垃圾块包括如下步骤: 垃圾分析模块根据该数据对象访问信息来分析数据对象最后一次访问到当前时间的时间长度,以及数据对象的最后一次访问和第一次访问的时间间隔,将数据对象的空闲时间较长,或是空闲时间和活动时间的比值超过阈值的数据对象设置为可疑的内存垃圾块。
12.如权利要求9所述内存垃圾回收方法,其特征在于,垃圾分析模块监控数据对象的内存分配和释放信息,包括数据对象的指针,起始地址,数据对象的大小和数据对象的创建时间戳信息,然后通过查询页表来将数据对象的虚拟地址信息转换为物理地址信息。
13.如权利要求9所述内存垃圾回收方法,其特征在于,垃圾监控模块侦听内存总线上的访存信号,获取该访存的物理地址,然后查询数据对象监控列表,将访存关联到数据对象,如果该访存为第一次访问某个数据对象,则记录该数据对象的第一次访问时间,否则更新数据对象的最后一次访问时间。
14.如权利要求13所述内存垃圾回收方法,其特征在于,垃圾监控模块通过访存监控卡或是在内存控制器内部增加逻辑单元实现侦听内存总线上的访存信号。
【文档编号】G06F12/02GK103577335SQ201310504532
【公开日】2014年2月12日 申请日期:2013年10月23日 优先权日:2013年10月23日
【发明者】王亚楠, 陈荔城, 崔泽汉, 陈明宇 申请人:中国科学院计算技术研究所
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1