一个隐蔽的内存泄漏——pthread_create后没有detach导致内存持续增长
来源:互联网 发布:贵阳广电网络老总电话 编辑:程序博客网 时间:2024/05/17 18:00
昨天解决了一个隐蔽的内存泄漏问题,原因是pthread_create后的僵死线程没有释放导致的内存持续增长。
现象是这样的:短时间内程序运行正常,但跑了12小时左右,用top查看其内存占用居然高达2G,于是马上意识到有内存泄漏。
最先想到的是malloc/free、new/delete没有配对,申请的内存没有释放。于是写了个跟踪malloc/free调用的模块,不过检查中并没有找到未释放的内存。之后怀疑是不是 free then malloc 导致的内存管理错误(事实证明虽然free后不是立即回收内存,但是接连调用free & malloc并不会影响操作系统的内存管理),不过写了个小程序发现并不是这么回事。
陷入窘境了,只好用最小系统法把功能部分和内存分配都给屏蔽掉,这时发现内存泄漏依然存在!仔细看top的输出,几乎是每次创建线程时内存就往上涨一点,只是增长速度不是很快,看来是线程的问题了。仔细分析发现,之前图简单pthread_create (&thread, NULL, &thread_function, NULL); 就这么写了,参数2没有设置线程结束后自动detach,并且没有使用pthread_join或pthread_detach释放执行结束后线程的空间!
Linux man page 里有已经说明了这个问题:
When a joinable thread terminates, its memory resources (thread descriptor and stack) are not deallocated until another thread performs pthread_join on it. Therefore,pthread_join must be called once for each joinable thread created to avoidmemory leaks.
也就说线程执行完后如果不join的话,线程的资源会一直得不到释放而导致内存泄漏!一时的图快后患无穷啊。
- 一个隐蔽的内存泄漏——pthread_create后没有detach导致内存持续增长
- 解决了一个隐蔽的内存泄漏——pthread_create后没有detach导致内存持续增长
- 解决了一个隐蔽的内存泄漏——pthread_create后没有detach导致内存持续增长
- pthread_create后没有detach导致内存持续增长
- pthread_create后没有detach导致内存持续增长
- 隐蔽的内存泄漏——pthread_create 属性设置不当导致
- 隐蔽的内存泄漏——pthread_create 属性设置不当导致
- 隐蔽的内存泄漏——pthread_create 属性设置不当导致
- pthread_create()使用detach分离后仍有内存泄漏
- pthread_create创建线程后必须使用join或detach释放线程资源[内存泄漏]
- CMemFile Detach 内存泄漏
- pthread_create 内存泄漏 valgrind
- pthread_create 内存泄漏 valgrind
- pthread_create 内存泄漏 valgrind
- pthread_create 内存泄漏 valgrind
- pthread_create 内存泄漏
- pthread_create 导致内存泄露
- 再谈android内存泄漏—常见的八种导致 APP 内存泄漏的问题
- 仿射变换
- 深入解析数据类型与变量
- 用GridView里的服务控件事件,同时获取GridView内的某个字段值
- linux kerne新版本编号?
- 编写sub过程
- 一个隐蔽的内存泄漏——pthread_create后没有detach导致内存持续增长
- eclipse3.5 安装 jad问题
- CSAP_MAT_BOM_MAINTAIN修改问题
- 编写Function过程开发函数
- @class vs. #import,两种方式的讨论
- 对象引用方式总结
- JAVA节省内存,防止不停地创建删除对象
- Oracle EBS客户化程序中格式化金额
- 评论:四川回应香港援建中学被拆:校园狭小无法教学