之前就因为glibc的free不一定会将内存归还OS,导致OOM,造成了上千万损失,当时心态差点崩了
五年前的时候,因为OOM导致进程无故被kill掉,也没有coredump,分析了好久,最后发现是因为因为glibc的free不一定会将内存归还OS,导致OOM,造成了上千万损失,当时心态差点崩了。
当时大概用了1个月的时间分析gblic下内存管理的源码
之前一直以为glibc只是一个中介,应用程序每次申请和释放内存都是通过glibc来操作,即应用程序每次调用malloc都是gblic向os申请内存,调用free都是gblic向os归还内存。但是,自从看了glibc源码之后,颠覆了我的认知,glibc下的内存管理器(ptmalloc),也可以说是一个内存池(我们暂且称之为内存池),应用程序的申请内存或者释放内存,都是在该内存池中实现,只有满足ptmalloc的某些特定条件之后,ptmalloc才会调用sys_trim函数,将内存归还操作系统。
下面是针对glibc中内存管理主要函数malloc和free的实现原理
1、下面是application申请内存时候的宏观图
2、glibc的分配和释放远比我想象复杂的多,里面涉及到bin概念
fast bins,small bins,largebins,top chunk,mmaped chunk以及lastremainder chunk
内存的释放和分配都是在上面这些里面操作的
3、下面是malloc流程图
malloc4、free流程如下图
free5、用了一个月分析代码,然后用了三周时间来写对gblic内存管理进行整理
希望后面有时间精进一些关于这方面的理解
来源:https://www.zhihu.com/question/575065794/answer/2869761623
需要了解更多,请继续阅读
https://mp.weixin.qq.com/s/pdv5MMUQ9ACpeCpyGnxb1Q
标签:malloc,C++,glibc,申请,free,gblic,内存 From: https://www.cnblogs.com/woodx/p/17082646.html