博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
glibc malloc常驻内存不释放问题抽象
阅读量:6914 次
发布时间:2019-06-27

本文共 942 字,大约阅读时间需要 3 分钟。

    最近测试中,我们的系统在多线程高并发访问的情况下,内存开始逐渐增长,到一定值以后,即使所有的连接线程都退出,常驻内存也不释放,经过仔细的检查分析,内置的内存资源池都正确释放,而且在连接活跃时,常驻内存在到达一定值后也会保持一个平稳水平,可以排除是我们系统代码的问题,这里可以通过一个简单的程序抛开无关的部分再现系统的内存占用问题。

#include
#include
#include
#include
#include
#include
#include
#define THREAD_NUM 5void* thread_malloc(void*);int main(int argc, char** argv){ pthread_t tid[THREAD_NUM]; int err, i, j = 10, pid; pid = getpid(); printf("pid = %d\n", pid); sleep(20); while( j-- > 0) { for(i=0; i

线程启动前的内存使用情况:

线程退出后的内存使用情况:常驻内存并没随线程退出释放

valgrind进行检查的结果:不存在内存泄露

  

    关于这个问题的详细原因,经多方查证问题出在glibc库的malloc上,通过glibc分配内存时,glibc有自己的内存管理机制,并不会将这部分内存马上归还给OS,这里推荐淘宝华庭的《glibc内存管理-ptmalloc2源代码分析》,里面对ptmalloc的分配原理从代码层给出了详细的分析,通过这个问题也让我感觉到,很难有一种内存管理方法适用于所有场景,为了让内存管理更有效率,应用系统本身的内存管理机制要与库提供的内存管理机制进行调试,必要的场合使用系统调用直接分配内存。

转载于:https://www.cnblogs.com/databaseaffair/p/3439560.html

你可能感兴趣的文章
linux中高端内存和低端内存的概念【转】
查看>>
软件整合--硬件整合--平台整合
查看>>
Android 将Activiyt作为Dialog弹出
查看>>
Android 抽屉类SlidingDrawer的使用
查看>>
Android][Android Studio] *.jar 与 *.aar 的生成与*.aar导入项目方法
查看>>
node-webkit教程(14)禁用缓存
查看>>
maven中properties标签定义变量
查看>>
Linux下路由配置梳理
查看>>
9.2. frame
查看>>
sql获取每门课程成绩最好的学生信息
查看>>
VS输出窗口(output view)的小技巧--文件行号字符定位
查看>>
14.4. Example
查看>>
[UIView beginAnimations:context:]与[UIView animateWithDuration:animations:]值得注意的一个区别...
查看>>
U3D的飞船太空射击例子中,使用coroutine
查看>>
Alibaba Cloud MaxCompute vs. AWS Redshift vs. Azure SQL Data Warehouse
查看>>
52.2. group by
查看>>
浅谈数据库用户表结构设计,第三方登录
查看>>
JS冒泡事件 与 事件捕获
查看>>
NetSetMan IP地址切换工具
查看>>
Lind.DDD敏捷领域驱动框架~Lind.DDD各层介绍
查看>>