glibc(ptmalloc)内存暴增问题解决
系统大全为您提供
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int alloc_time = 4000;
char *a[alloc_time];
char *b[alloc_time];
int i, j;
for(i=0; i<alloc_time; i++)
{
a[i] = (char *)malloc(52722);
memset(a[i], 1, 52722);
b[i] = (char *)malloc(1);
memset(b[i], 1, 1);
}
printf("malloc finished ");
for(i=alloc_time-1; i>=0; i--)
{
free(a[i]);
free(b[i]);
}
printf("free finished ");
/ar *p = (char *)malloc(2000);
//free(p);
while(1){
sleep(3);
}
}
运行这个测试程序,发现Glibc内存暴增,程序已经把内存返回给了Glibc库,但Glibc库却没有把内存归还给操作系统。
分析:
ptmalloc使用chunk结构来实现内存管理。用户free掉的内存并不是都会马上归还给系统,ptmalloc会统一管理heap和mmap映射区域中的空闲chunk.当用户进行下一次分配请求时,ptmalloc会首先试图在空闲的chunk中挑选一块给用户,这样就避免了频繁的系统调用,降低了内存分配的开销。对于空闲的chunk,ptmalloc采用分箱式内存管理方式,根据空闲chunk的大小和处于的状态将其放在三个不同的容器中。
bins:ptmalloc将相似大小的chunk用双向链表链接起来,这样的一个链表被称为一个bin.bins有128个队列,前64个队列是定长的(small bins),每隔8个字节大小的块分配在一个队列,后面的64个队列是不定长的(large bins),就是在一个范围长度的都分配在一个队列中。所有长度小于512字节的都分配在定长的队列中,后面的64个队列是变长的队列,每个队列中的chunk都是从大到小排列的。
unsort队列(只有一个队列),它是一个cache,所有free下来的如果要进入bins队列中都要经过unsort队列,分配内存时会查看unsorted bin中是否有合适的chunk,如果找到满足条件的chunk,则直接返回给用户,否则将unsorted bin中所有chunk放入bins中。
fastbins,大约有10个定长队列,它是一个高速缓冲,所有free下来的并且长度是小于max_fast(默认80B)的chunk就会进入这种队列中。进入此队列的chunk在free的时候并不修改使用位,目的是为了避免被相邻的块合并掉。
如果内存块是空闲的,它会挂在其中的一个队列中,它是通过复用的方式,使用空闲chunk的第3个字和第4个字当作它的前链和后链(变长块是第5个字和第6个字)。
malloc的步骤:
1. 先在fastbins中找,如果能找到,从队列中取下后(不需要再置使用位为1)立刻返回;
2. 判断需求的块是否在small bins(bins的前64个bin)范围,如果在小箱子范围,并且刚好有满足需求的块,则直接返回内存地址;
3. 到了这一步,说明需要分配的是一块大内存,或者小箱子里找不到合适的chunk;这个时候,会触发consolidate,ptmalloc首先会遍历fastbins中的chunk,将相邻的chunk合并,并链接到unsorted bin中(因为在大箱子找一般都要切割,所以要优先合并,避免过多碎片);
4. 在unsort bin中取出一个chunk,如果能找到刚好和想要的chunk相同大小的chunk,立刻返回,如果不是想要的chunk大小的chunk,就把它插入到bins对应的队列中去,转到2.
5. 到了这一步,说明需要分配的是一块大的内存,或者small bins和unsorted bin中都找不到合适的chunk,并且fastbins和unsorted bin中所有的chunk都清楚干净了。在large bins中找,找到一个最小的能符合需求的chunk从队列中取下,如果剩下的大小还能建一个chunk,就把chunk分成两个部分,把剩下的chunk插入到unsort队列中取,把chunk的内存地址返回;
6. 如果搜索fastbins和bins都没有找到合适的chunk,那么就需要操作topchunk(是堆顶的一个chunk,不会放在任何一个队列里)来进行分配了。在topchunk找,如果能切出符合要求的,把剩下的一部分当作topchunk,然后返回内存地址;
7. 到了这一步说明topchunk也不能满足分配要求,就只能调用sysalloc,其实就是增长堆了,然后返回内存地址。
free的步骤:
1. 判断所需释放的chunk是否为mmaped chunk,如果是,则调用munmap释放mmaped chunk,解除内存空间映射,该空间不再有效,然后立刻返回;
2. 如果和topchunk相邻,直接和topchunk合并,不会放到其他的空闲队列中取,然后立刻返回;
3. 如果释放的大小小于max_fast(80字节),就把它挂到fastbins中去返回,使用位仍然为1,当然更不会去合并相邻块,然后立刻返回;
4. 如果释放块得大小介于80-128K,把chunk的使用位置为0,判断前一个chunk是否处于使用中,如果前一块也是空闲块,则合并,并转入下一步;
5. 判断当前释放chunk的下一个块是否为top chunk,如果是,则转到第7步,否则转下一步;
6. 判断下一个chunk是否处在使用中,如果也是空闲的,则合并,并将合并后的chunk挂到unsort队列中去;
7. 如果执行到了这一步,说明释放了一个与top chunk相邻的chunk;则无论它有多大,都将它与top chunk合并,并更新top chunk的大小等信息,转下一步;
8. 如果合并后的大小大于FASTBIN_CONSOLIDATION_THRESHOLD(64K),也会触发consolidate,即fastbins的合并操作,合并后的chunk会被放到unsorted bin中,fastbins将变为空,操作完成之后转下一步;
9. 试图收缩堆。(判断topchunk的大小是否大于mmap的收缩阈值,默认为128KB)。
ptmalloc对于大于128K的块通过mmap方式来分配,小于128K(mmap分配阈值)的块在heap中分配。堆是通过brk的方式来增加或压缩的,如果在现有的堆中不能找到合适的chunk,会通过增长堆的方式来满足分配,如果堆顶的空闲块超过一定的阈值会收缩堆,所以只要堆顶的空间没释放,堆是一直不会收缩的。因为ptmalloc的内存收缩是从top chunk开始,如果与top chunk(堆顶的一个chunk)相邻的那个chunk在内存池中没有释放,top chunk以下的空闲内存都无法返回给系统,即使这些空闲内存有几十个G也不行。
以上就是系统大全给大家介绍的如何使的方法都有一定的了解了吧,好了,如果大家还想了解更多的资讯,那就赶紧点击系统大全官网吧。
本文来自系统大全http://www.win7cn.com/如需转载请注明!推荐:win7纯净版
相关文章
- win11如何添加控制面板?win11控制面板快捷方式添加方法
- win11如何设置绿色护眼模式?win11绿色护眼模式开启教程
- win11开始菜单怎么固定软件?win11开始菜单固定软件设置方法
- win10不显示新安装硬盘怎么办?win10新安装硬盘找不到解决方法
- win10分辨率无法设置怎么办?win10分辨率不能修改解决方法
- win10如何修改开机问候语?win10系统开机问候语更改教程
- win7电脑怎么整理磁盘碎片?win7系统磁盘碎片整理操作方法
- win7系统修改用户名后无法登录账号怎么解决?
- 360浏览器如何开启桌面搜索栏?360浏览器桌面搜索栏启动教程
- Word怎么切换成正常模式?Word兼容模式修改为正常模式教程
系统下载排行榜71011xp
番茄花园 GHOST WIN7 SP1 X64 快速稳定版 V2017.03 (64位
2深度技术 GHOST WIN7 SP1 X64 稳定安全版 V2017.02(64位
3雨林木风 GHOST WIN7 SP1(32位)装机版 V2017.03
4深度技术 GHOST WIN7 SP1 X86 专业装机版 V2017.03(32位
5电脑公司 GHOST WIN7 SP1 X86 经典旗舰版 V2017.03(32位
6深度技术 GHOST WIN7 SP1 X86 稳定安全版 V2017.02
7深度技术 GHOST WIN7 SP1 X64 专业装机版 V2017.03(64位
8电脑公司 GHOST WIN7 SP1 X64 经典旗舰版 V2017.03(64位
9电脑公司 GHOST WIN7 SP1 X64 新春贺岁版 V2017.02(64位
10电脑公司 GHOST WIN7 SP1 X86 新春贺岁版 V2017.02(32位
win10系统下载 Win10 1607 精简安装版 LTSB长期服务版
2Win10专业工作站版最新镜像 V2022.06
3微软原版Win10 ISO镜像64位(win10纯净版)
4深度技术 Ghost Win10 64位 国庆特别版 V2021.10
5电脑公司Ghost Win10 64位装机版V2017.03
6雨晨 Win10 1703 15063.250 64位 极速精简版
7JUJUMAO Win8.1 Up3 X64 极速精简版v2019.11
8win10系统下载 稳安快 Win10 x64 极速精简版 V1.0
9lopatkin Win10专业精简版 V2022.05
10Win10 21H2 纯净版镜像 V2021
Win11PE网络纯净版 V2021
2风林火山 Ghost Win11 64位 专业正式版 V2021.10
3Win11官方纯净版 V2021
4Win11 23H2 25115 官方原版镜像 V2022.05
5新一代系统 JUJUMAO Win11专业版 64位 v2021.08
6雨林木风 Ghost Win11 64位 正式版 V2021.10
7微软MSDN原版Win11系统 V2021
8Win11 22000.282正式版镜像 V2021.10
9深度技术 Ghost Win11 64位 专业版 V2021.10
10微软Win11游戏系统 V2021.10
深度技术 GHOST XP SP3 电脑专用版 V2017.03
2深度技术 GGHOST XP SP3 电脑专用版 V2017.02
3Win7系统下载 PCOS技术Ghost WinXP SP3 2017 夏季装机版
4萝卜家园 GHOST XP SP3 万能装机版 V2017.03
5番茄花园 GHOST XP SP3 极速体验版 V2017.03
6雨林木风 GHOST XP SP3 官方旗舰版 V2017.03
7电脑公司 GHOST XP SP3 经典旗舰版 V2017.03
8雨林木风GHOST XP SP3完美纯净版【V201710】已激活
9萝卜家园 GHOST XP SP3 完美装机版 V2016.10
10雨林木风 GHOST XP SP3 精英装机版 V2017.04
热门教程
装机必备 更多+
重装工具