CN108536609A - 内存碎片管理***及方法 - Google Patents
内存碎片管理***及方法 Download PDFInfo
- Publication number
- CN108536609A CN108536609A CN201710119705.9A CN201710119705A CN108536609A CN 108536609 A CN108536609 A CN 108536609A CN 201710119705 A CN201710119705 A CN 201710119705A CN 108536609 A CN108536609 A CN 108536609A
- Authority
- CN
- China
- Prior art keywords
- memory
- block
- isolated
- user
- function
- 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.)
- Granted
Links
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
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Memory System (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明涉及计算机内存管理技术,其公开了一种内存碎片管理***及方法,将离散内存碎片整理成连续内存碎片,进行形成大块空闲内存,便于提高内存资源的利用率。该方法包括步骤:a.在进行内存分配时,在所分配内存中指定用户内存回收处理回调函数;b.在内存管理任务启动时,检测所分配的内存块中是否存在孤立块,并判断所述孤立块是否需要被释放,若需要被释放,则调用该孤立块对应的用户内存回收处理回调函数;c.在用户内存回收处理回调函数被调用后,重新分配一块内存保存孤立块中的数据,并将对孤立块内存的引用修改为对所述新分配的内存的引用,然后释放孤立块。本发明适用于内存管理。
Description
技术领域
本发明涉及计算机内存管理技术,具体涉及一种内存碎片管理***及方法。
背景技术
内存是计算机***中的重要组成部分,实现数据的存储功能:存放原始数据、中间数据和运算结果等,也是高速执行单元与外部低速存储部件之间的缓存单元。
内存管理则是计算机软件***中的一项很重要的基础功能,比较好的内存管理可以使计算机***中内存得到最高效的利用,内存碎片尽量的少。
计算机工作一段时间后一般会出现内存碎片(多块小块空闲内存),如果出现大量的内存碎片,可能使得某些软件功能模块无法运行。如图1,在空闲内存块Fi和Fj之间被孤立块Am隔离,形成两块离散的碎片,则这样的离散内存碎片无法被整理成更大的空闲内存块,造成计算机内存资源的浪费。
发明内容
本发明所要解决的技术问题是:提出一种内存碎片管理***及方法,将离散内存碎片整理成连续内存碎片,进而形成大块空闲内存,便于提高内存资源的利用率。
一方面,本发明实施例提供一种内存碎片管理***,包括:
管理模块,用于生成内存管理任务;以及,为用户模块提供内存分配接口函数,在所述内存分配接口函数中增加一个参数-用户内存回收处理回调函数;
检测模块,用于在内存管理任务启动时,检测用户模块所分配的内存块中是否存在孤立块,并判断所述孤立块是否需要被释放,若需要被释放,则通知管理模块调用该孤立块对应的用户内存回收处理回调函数;
用户模块,用于在进行内存分配时,在所分配内存中指定用户内存回收处理回调函数;以及,在用户内存回收处理回调函数被调用后,重新分配一块内存保存孤立块中的数据,并将对孤立块内存的引用修改为对所述新分配的内存的引用,然后释放孤立块。
作为进一步优化,所述用户模块还用于在进行内存分配时,判断分配的内存小于一定阈值且内存中的数据在***运行过程中可以搬移时,才在所分配内存中指定用户内存回收处理函数。
作为进一步优化,所述在所分配内存中指定用户内存回收处理函数的方法为:
在所分配内存的管理头部新开辟一个字段用于保存用户内存回收处理函数。
作为进一步优化,所述检测模块检测用户模块所分配的内存块中是否存在孤立块,并判断所述孤立块是否需要被释放的方法为:
若检测到某个已分配的内存块隔离了前后两个空闲内存块,则判定该已分配的内存块为孤立块,若孤立块所隔离的前后两个空闲内存块的大小之和为孤立块大小的n倍以上,则判定该孤立块需要被释放。
作为进一步优化,所述用户模块还用于,在重新分配内存时,紧邻着已分配的大块内存后分配一块新的内存保存孤立块中的数据。
再一方面,本发明实施例提供了一种内存碎片管理方法,其包括以下步骤:
a.在进行内存分配时,在所分配内存中指定用户内存回收处理回调函数;
b.在内存管理任务启动时,检测所分配的内存块中是否存在孤立块,并判断所述孤立块是否需要被释放,若需要被释放,则调用该孤立块对应的用户内存回收处理回调函数;
c.在用户内存回收处理回调函数被调用后,重新分配一块内存保存孤立块中的数据,并将对孤立块内存的引用修改为对所述新分配的内存的引用,然后释放孤立块。
作为进一步优化,步骤a中,在进行内存分配时,判断分配的内存小于一定阈值且内存中的数据在***运行过程中可以搬移时,才在所分配内存中指定用户内存回收处理函数。
作为进一步优化,所述在所分配内存中指定用户内存回收处理函数的方法为:
在所分配内存的管理头部新开辟一个字段用于保存用户内存回收处理函数。
作为进一步优化,步骤b中,检测所分配的内存块中是否存在孤立块,并判断所述孤立块是否需要被释放的方法为:
若检测到某个已分配的内存块隔离了前后两个空闲内存块,则判定该已分配的内存块为孤立块,若孤立块所隔离的前后两个空闲内存块的大小之和为孤立块大小的n倍以上,则判定该孤立块需要被释放。
作为进一步优化,步骤c中,在重新分配内存时,紧邻着已分配的大块内存后分配一块新的内存保存孤立块中的数据。
本发明的有益效果是:
可以有效解决离散内存碎片问题,从而提升内存资源的利用率;且本发明的方案在目前的内存管理(如slab内存管理)机制中进行简单的参数修改即可实现,实现简便。
附图说明
图1为离散内存碎片的示意图;
图2为本发明的内存碎片管理***示意图;
图3为本发明的内存碎片管理方法流程图;
图4为实施例中内存碎片搬移过程示意图。
具体实施方式
本发明旨在提出一种内存碎片管理***及方法,将离散内存碎片整理成连续内存碎片,进行形成大块空闲内存,便于提高内存资源的利用率。其核心思想为:在进行内存分配时,在分配的内存中指定一个用户内存回收处理函数,当检测到有孤立块(离散的内存碎片)存在时,调用该内存回收处理函数,重新分配内存保存孤立块中的数据然后释放孤立块,从而可以将连续内存碎片整理成一块大的内存碎片,如果该更大的内存碎片仍然被其它孤立块隔离,那么释放孤立块又会形成一块更大的内存碎片,以此类推,最后经过碎片整理后会形成足够大的空闲内存块,从而满足某些功能对大块空闲内存的需求,也提高了内存资源利用率。
如图2所示,本发明中的内存碎片管理***包括:
管理模块,用于生成内存管理任务;以及,为用户模块提供内存分配接口函数,在所述内存分配接口函数中增加一个参数-用户内存回收处理回调函数;
检测模块,用于在内存管理任务启动时,检测用户模块所分配的内存块中是否存在孤立块,并判断所述孤立块是否需要被释放,若需要被释放,则通知管理模块调用该孤立块对应的用户内存回收处理回调函数;
用户模块,用于在进行内存分配时,在所分配内存中指定用户内存回收处理回调函数;以及,在用户内存回收处理回调函数被调用后,重新分配一块内存保存孤立块中的数据,并将对孤立块内存的引用修改为对所述新分配的内存的引用,然后释放孤立块。
基于上述内存碎片管理***,本发明提出的内存碎片管理方法如图3所示,其包括以下实现步骤:
1、在分配的内存中指定用户内存回收处理函数:在进行内存分配时,在所分配内存中指定用户内存回收处理回调函数;
本步骤在具体实现时,如果内存块大小较大,搬移时间过长,并不适合进行搬移,因此就没有必要在这些内存中指定内存回收处理回调函数;有些内存块中保存的数据并不支持搬移,也没有必须要在这些内存中指定内存回收处理回调函数;因而,在进行内存分配时,判断分配的内存小于一定阈值且内存中的数据在***运行过程中可以搬移时,才在所分配内存中指定用户内存回收处理函数。
2、检测孤立块,若需要被释放,则调用其对应的用户内存回收处理回调函数:在内存管理任务启动时,检测所分配的内存块中是否存在孤立块,并判断所述孤立块是否需要被释放,若需要被释放,则调用该孤立块对应的用户内存回收处理回调函数;
本步骤在具体实现时,检测所分配的内存块中是否存在孤立块,并判断所述孤立块是否需要被释放的方法为:
若检测到某个已分配的内存块隔离了前后两个空闲内存块,则判定该已分配的内存块为孤立块,若孤立块所隔离的前后两个空闲内存块的大小之和为孤立块大小的n倍(比如10倍)以上,则判定该孤立块需要被释放。
3、重新分配内存保存孤立块中的数据,修改引用并释放孤立块:在用户内存回收处理回调函数被调用后,重新分配一块内存保存孤立块中的数据,并将对孤立块内存的引用修改为对所述新分配的内存的引用,然后释放孤立块。
本步骤在具体实现时,所述新分配内存一般需要紧接着已分配的大块内存后面进行分配。这等效于将孤立块平移到已分配大块内存的后面,而释放的孤立块与原来的隔离的离散块将形成连续的空闲内存块,而这些连续的空闲块将被整理成更大的空闲块。
实施例:
如图4所示,以对离散内存碎片(孤立块)A1、A2、A3、A4进行整理为例具体说明本发明的实现方案:
如果将孤立块A2、A3、A4平移到A1,则离散的空闲内存块F1、F2、F3和F4将形成连续的更大的空闲内存块;为实现上述目的,采用如下手段:
在管理模块为用户模块提供的内存分配接口函数中增加一个参数-用户内存回收处理回调函数;即,在分配函数中除了原有的分配内存大小功能外,还要增加一个用户内存回收钩子函数。定义如下:
void*malloc(int size,void(*user_free)(void*addr))
这个函数的意义是:当检测到某个用户模块分配的内存块(称该内存块为孤立块)隔离了前后两个空闲内存块,则调用该钩子函数通知所对应的用户模块释放孤立块。该用户内存回收钩子函数被保存在所分配内存的管理头部字段中。
在图4中,首先调用孤立块A2的用户内存回收钩子函数,用户模块重新为其分配一块紧邻着内存块A1的内存以保存数据,然后将对孤立块A2内存的引用修改为对新分配的内存的引用,再释放A2,完成了对孤立块A2的搬移;
同样,再调用孤立块A3的用户内存回收钩子函数,完成对孤立块A3的搬移,最后再调用孤立块A4的用户内存回收钩子函数,完成对孤立块A4的搬移;
搬移之后原来隔离的空闲内存块F1、F2、F3和F4就形成了连续的更大的空闲内存块,从而满足某些功能对大块空闲内存的需求。
Claims (10)
1.内存碎片管理***,其特征在于,包括:
管理模块,用于生成内存管理任务;以及为用户模块提供内存分配接口函数,在所述内存分配接口函数中增加一个参数-用户内存回收处理回调函数;
检测模块,用于在内存管理任务启动时,检测用户模块所分配的内存块中是否存在孤立块,并判断所述孤立块是否需要被释放,若需要被释放,则通知管理模块调用该孤立块对应的用户内存回收处理回调函数;
用户模块,用于在进行内存分配时,在所分配内存中指定用户内存回收处理回调函数;以及在用户内存回收处理回调函数被调用后,重新分配一块内存保存孤立块中的数据,并将对孤立块内存的引用修改为对所述新分配的内存的引用,然后释放孤立块。
2.如权利要求1所述的内存碎片管理***,其特征在于,所述用户模块还用于,在进行内存分配时,判断分配的内存小于一定阈值且内存中的数据在***运行过程中可以搬移时,才在所分配内存中指定用户内存回收处理函数。
3.如权利要求1所述的内存碎片管理***,其特征在于,所述在所分配内存中指定用户内存回收处理函数的方法为:
在所分配内存的管理头部新开辟一个字段用于保存用户内存回收处理函数。
4.如权利要求1所述的内存碎片管理***,其特征在于,所述检测模块检测用户模块所分配的内存块中是否存在孤立块,并判断所述孤立块是否需要被释放的方法为:
若检测到某个已分配的内存块隔离了前后两个空闲内存块,则判定该已分配的内存块为孤立块,若孤立块所隔离的前后两个空闲内存块的大小之和为孤立块大小的n倍以上,则判定该孤立块需要被释放。
5.如权利要求1所述的内存碎片管理***,其特征在于,所述用户模块还用于,在重新分配内存时,紧邻着已分配的大块内存后分配一块新的内存保存孤立块中的数据。
6.内存碎片管理方法,其特征在于,包括以下步骤:
a.在进行内存分配时,在所分配内存中指定用户内存回收处理回调函数;
b.在内存管理任务启动时,检测所分配的内存块中是否存在孤立块,并判断所述孤立块是否需要被释放,若需要被释放,则调用该孤立块对应的用户内存回收处理回调函数;
c.在用户内存回收处理回调函数被调用后,重新分配一块内存保存孤立块中的数据,并将对孤立块内存的引用修改为对所述新分配的内存的引用,然后释放孤立块。
7.如权利要求6所述的内存碎片管理方法,其特征在于,步骤a中,在进行内存分配时,判断分配的内存小于一定阈值且内存中的数据在***运行过程中可以搬移时,才在所分配内存中指定用户内存回收处理函数。
8.如权利要求6所述的内存碎片管理方法,其特征在于,所述在所分配内存中指定用户内存回收处理函数的方法为:
在所分配内存的管理头部新开辟一个字段用于保存用户内存回收处理函数。
9.如权利要求6所述的内存碎片管理方法,其特征在于,步骤b中,检测所分配的内存块中是否存在孤立块,并判断所述孤立块是否需要被释放的方法为:
若检测到某个已分配的内存块隔离了前后两个空闲内存块,则判定该已分配的内存块为孤立块,若孤立块所隔离的前后两个空闲内存块的大小之和为孤立块大小的n倍以上,则判定该孤立块需要被释放。
10.如权利要求6所述的内存碎片管理方法,其特征在于,步骤c中,在重新分配内存时,紧邻着已分配的大块内存后分配一块新的内存保存孤立块中的数据。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710119705.9A CN108536609B (zh) | 2017-03-02 | 2017-03-02 | 内存碎片管理***及方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710119705.9A CN108536609B (zh) | 2017-03-02 | 2017-03-02 | 内存碎片管理***及方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108536609A true CN108536609A (zh) | 2018-09-14 |
CN108536609B CN108536609B (zh) | 2022-02-22 |
Family
ID=63488834
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710119705.9A Active CN108536609B (zh) | 2017-03-02 | 2017-03-02 | 内存碎片管理***及方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108536609B (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111008076A (zh) * | 2019-12-06 | 2020-04-14 | 安徽芯智科技有限公司 | 一种基于slab算法的内存管理方法 |
CN111124941A (zh) * | 2018-11-01 | 2020-05-08 | 奇酷互联网络科技(深圳)有限公司 | 内存碎片清理方法、电子设备及具有存储功能的装置 |
CN112612723A (zh) * | 2020-12-29 | 2021-04-06 | 天津南大通用数据技术股份有限公司 | 一种基于pagesize进行内存平移合并降低内存碎片的方法 |
CN116049021A (zh) * | 2022-08-29 | 2023-05-02 | 荣耀终端有限公司 | 存储空间管理方法、电子设备及计算机可读存储介质 |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20040139272A1 (en) * | 2000-09-13 | 2004-07-15 | Gustavo Rodriguez-Rivera | Conservative garbage collectors that can be used with general memory allocators |
CN1979448A (zh) * | 2005-12-05 | 2007-06-13 | 迈普(四川)通信技术有限公司 | 一种主动回收数据缓冲区的方法 |
CN101226487A (zh) * | 2008-01-30 | 2008-07-23 | 中国船舶重工集团公司第七〇九研究所 | 基于嵌入式Linux操作***的内核级线程库的实现方法 |
CN101320351A (zh) * | 2008-06-27 | 2008-12-10 | 华中科技大学 | 内存的分配、清理和释放方法及内存管理的装置 |
CN101763305A (zh) * | 2009-12-29 | 2010-06-30 | 青岛海信宽带多媒体技术有限公司 | 一种嵌入式***内存泄露的检测方法 |
CN102521145A (zh) * | 2011-12-23 | 2012-06-27 | 东信和平智能卡股份有限公司 | Java卡***及其空间分配处理方法 |
CN103389947A (zh) * | 2013-08-06 | 2013-11-13 | 哈尔滨工业大学 | 基于VxWorks的光刻机双工件台控制***的内存管理器及管理方法 |
CN104391496A (zh) * | 2014-12-09 | 2015-03-04 | 北京四方继保自动化股份有限公司 | 一种工业控制***数据内存的管理方法 |
-
2017
- 2017-03-02 CN CN201710119705.9A patent/CN108536609B/zh active Active
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20040139272A1 (en) * | 2000-09-13 | 2004-07-15 | Gustavo Rodriguez-Rivera | Conservative garbage collectors that can be used with general memory allocators |
CN1979448A (zh) * | 2005-12-05 | 2007-06-13 | 迈普(四川)通信技术有限公司 | 一种主动回收数据缓冲区的方法 |
CN101226487A (zh) * | 2008-01-30 | 2008-07-23 | 中国船舶重工集团公司第七〇九研究所 | 基于嵌入式Linux操作***的内核级线程库的实现方法 |
CN101320351A (zh) * | 2008-06-27 | 2008-12-10 | 华中科技大学 | 内存的分配、清理和释放方法及内存管理的装置 |
CN101763305A (zh) * | 2009-12-29 | 2010-06-30 | 青岛海信宽带多媒体技术有限公司 | 一种嵌入式***内存泄露的检测方法 |
CN102521145A (zh) * | 2011-12-23 | 2012-06-27 | 东信和平智能卡股份有限公司 | Java卡***及其空间分配处理方法 |
CN103389947A (zh) * | 2013-08-06 | 2013-11-13 | 哈尔滨工业大学 | 基于VxWorks的光刻机双工件台控制***的内存管理器及管理方法 |
CN104391496A (zh) * | 2014-12-09 | 2015-03-04 | 北京四方继保自动化股份有限公司 | 一种工业控制***数据内存的管理方法 |
Non-Patent Citations (2)
Title |
---|
李倩; 潘敏学; 李宣东: "内存泄漏检测工具与评估方法", 《计算机科学与探索》 * |
李慧璐: "对VxWorks中内存管理和定时器模块的改进", 《中国优秀硕士学位论文全文数据库 信息科技辑》 * |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111124941A (zh) * | 2018-11-01 | 2020-05-08 | 奇酷互联网络科技(深圳)有限公司 | 内存碎片清理方法、电子设备及具有存储功能的装置 |
CN111008076A (zh) * | 2019-12-06 | 2020-04-14 | 安徽芯智科技有限公司 | 一种基于slab算法的内存管理方法 |
CN111008076B (zh) * | 2019-12-06 | 2023-03-14 | 安徽芯智科技有限公司 | 一种基于slab算法的内存管理方法 |
CN112612723A (zh) * | 2020-12-29 | 2021-04-06 | 天津南大通用数据技术股份有限公司 | 一种基于pagesize进行内存平移合并降低内存碎片的方法 |
CN116049021A (zh) * | 2022-08-29 | 2023-05-02 | 荣耀终端有限公司 | 存储空间管理方法、电子设备及计算机可读存储介质 |
CN116049021B (zh) * | 2022-08-29 | 2023-10-20 | 荣耀终端有限公司 | 存储空间管理方法、电子设备及计算机可读存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN108536609B (zh) | 2022-02-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108536609A (zh) | 内存碎片管理***及方法 | |
US11586451B2 (en) | Resource management with dynamic resource policies | |
CN103677977B (zh) | 清理移动终端中临时文件的方法、装置和移动终端 | |
CN106354562A (zh) | 内存清理***和内存清理方法 | |
CN108038002A (zh) | 一种嵌入式软件内存管理方法 | |
CN106649146A (zh) | 一种内存释放方法及装置 | |
CN106598725A (zh) | 一种基于Android的Handler防内存泄漏装置及方法 | |
CN106339444A (zh) | 一种即时删除文件的方法及终端 | |
CN108984295A (zh) | 内存回收方法、计算机装置及计算机可读存储介质 | |
CN104123192A (zh) | 一种linux***下基于内存子***的性能调优方法 | |
CN108228343A (zh) | 内存回收方法及装置、计算机装置及计算机可读存储介质 | |
CN108920271A (zh) | 应用缓存清理方法、装置、存储介质和终端 | |
CN106959898A (zh) | 减少内存占用的方法、装置及移动终端 | |
CN101894049A (zh) | 一种自适应回收垃圾对象的***及方法 | |
CN102799421A (zh) | 一种多视图切换的***和方法 | |
CN102929929A (zh) | 一种数据汇总方法和装置 | |
CN104536773B (zh) | 基于内存扫描的嵌入式软件动态内存回收方法 | |
CN102270134B (zh) | 一种Java卡中垃圾回收的方法及装置 | |
CN106250547A (zh) | 一种控制红包的方法以及*** | |
CN106095577B (zh) | 基于多路处理器的共享内存的优化处理方法及装置 | |
CN106557434A (zh) | 一种界面缓存方法及*** | |
CN108681469B (zh) | 基于Android***的页面缓存方法、装置、设备及存储介质 | |
CN105302734B (zh) | 内存管理***和方法 | |
US8595462B2 (en) | Dynamic measurement and adaptation of a copying garbage collector | |
CN106357625B (zh) | 一种多媒体信息发布方法及服务器 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |