免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 14260 | 回复: 11
打印 上一主题 下一主题

Linux 多线程内存释放问题--线程退出为什么不释放内存??? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-06 10:50 |只看该作者 |倒序浏览
最近我写一个简单的小程序,会不断的创建线程.跑个十多天,内存涨了很多.起初怀疑是malloc问题,但没有找到.
后来我怀疑是线程有没有退出的,发现也不是.然后我才发现是线程退出了,而内存没有释放...

请看示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>

void * _thread(void *argv)
{
&nbsp;&nbsp;&nbsp;&nbsp;printf("###thread[%d] running...\n",pthread_self());
&nbsp;&nbsp;&nbsp;&nbsp;sleep(10);
&nbsp;&nbsp;&nbsp;&nbsp;printf("###thread[%d] END...\n",pthread_self());
&nbsp;&nbsp;&nbsp;&nbsp;return (void *)0;
}
int main(int argc, char **argv)
{     
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_t thrd;
&nbsp;&nbsp;&nbsp;&nbsp;int result,rt;
&nbsp;&nbsp;&nbsp;&nbsp;pthread_attr_t attr;
&nbsp;&nbsp;&nbsp;&nbsp;pthread_attr_init(&attr);
&nbsp;&nbsp;&nbsp;&nbsp;pthread_attr_setstacksize(&attr, (int)(1024 * 1024 * 3.5 ) ); // <--请改变栈大小测试

&nbsp;&nbsp;&nbsp;&nbsp;sleep(10);
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;int i;
&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i<10;i++)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result = pthread_create(&thrd,&attr,_thread,(void*)0);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(result)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("thread created error...\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("thread created =%d\n",thrd);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rt=pthread_detach(thrd);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (rt)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("pthread_detach error\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;pthread_attr_destroy(&attr);
&nbsp;&nbsp;&nbsp;&nbsp;sleep(300);
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}


我测试的结果是:
当栈在3.5M以下时候,线程退出基本不会释放内存;
当栈在10M时候,退出大约会释放60%的内存;
当栈在20M以上时候,退出大约会释放90%的内存

这就郁闷了,我的程序内存越来越大,怎么办?

大家是怎么解决的?还是我在哪里处理有问题?
谢谢大家~~~

[ 本帖最后由 superdbs 于 2009-8-6 11:29 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-08-06 11:08 |只看该作者
顺便说一些,我的系统是Centos;
[yl@localhost other]$ cat /etc/redhat-release
Red Hat Enterprise Linux AS release 4 (Nahant Update 4)
[yl@localhost other]$ uname -a
Linux localhost.localdomain 2.6.9-42.ELsmp #1 SMP Wed Jul 12 23:27:17 EDT 2006 i686 i686 i386 GNU/Linux

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
3 [报告]
发表于 2009-08-06 11:35 |只看该作者

回复 #1 superdbs 的帖子

线程既没有 detach, 退出后也没有 join?

论坛徽章:
0
4 [报告]
发表于 2009-08-06 11:56 |只看该作者
原帖由 MMMIX 于 2009-8-6 11:35 发表
线程既没有 detach, 退出后也没有 join?


有的:rt=pthread_detach(thrd);

论坛徽章:
0
5 [报告]
发表于 2009-08-06 13:20 |只看该作者
原帖由 superdbs 于 2009-8-6 10:50 发表
这就郁闷了,我的程序内存越来越大,怎么办?

大家是怎么解决的?还是我在哪里处理有问题?


没有什么怎么办的,也不需要解决,这并不是什么问题。

并不是你申请的空间就一定会立即分配、也不是你释放的空间就会立即回收。 分配和回收都是要消耗时间的,所以尽量不分配(要申请空间的时候去缓存里面取)、尽量不回收(要回收的时候放回缓存里面去),这是底层软件(lib/kernel)一般的设计思路。

如果你坚信上面的提到的现象是一个问题,那么你可以改一下程序,主程序做一个死循环,不断创建线程。线程打印一个log什么的就退出。随着线程不断地创建/销毁,内存使用会一直增加吗?(如果是,那么这是一个问题。否则,机制使然。)
事实上内存使用会在增加到某一数值后逐渐收敛,并不会无限制的猛涨。

论坛徽章:
0
6 [报告]
发表于 2009-08-06 13:31 |只看该作者
原帖由 kouu 于 2009-8-6 13:20 发表


没有什么怎么办的,也不需要解决,这并不是什么问题。

并不是你申请的空间就一定会立即分配、也不是你释放的空间就会立即回收。 分配和回收都是要消耗时间的,所以尽量不分配(要申请空间的时候去缓存里 ...


谢谢你的回复.

可是我的程序运行十多天,都有100多兆了!!!!启动的时候15M左右....感觉很不好,这样看着也不舒服啊.

论坛徽章:
0
7 [报告]
发表于 2009-08-06 18:21 |只看该作者

回复 #6 superdbs 的帖子

你的这个测试代码运行十多天后,内存会涨到100多兆吗? 显然不是的吧……
我建议你把这个测试代码改成无限循环的,里面也不要什么sleep了,就让它一直跑,一直不停的创建和销毁线程。 不用几分钟,内存是一直增长,还是会收敛,一目了然~
然后问题出在线程上还是出在你的程序的其他地方,你不就有结果了吗?

调试嘛,理清思路,一步步去逼近,一定能发现问题的。

我把你的测试代码改了一下,改成无限循环的,跑了一下,每秒钟估计会有数百个线程被创建和销毁。但是内存的使用是会收敛的。
如果在你的系统上不会收敛,那么是得怀疑一下线程库有没有问题了……

[ 本帖最后由 kouu 于 2009-8-6 18:33 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2009-08-06 18:27 |只看该作者
这个程序能连续运行十几天么?

论坛徽章:
0
9 [报告]
发表于 2009-08-07 09:21 |只看该作者

回复 #8 xiaopeng14 的帖子

这只是示例

论坛徽章:
0
10 [报告]
发表于 2009-08-07 09:42 |只看该作者
原帖由 kouu 于 2009-8-6 18:21 发表
你的这个测试代码运行十多天后,内存会涨到100多兆吗? 显然不是的吧……
我建议你把这个测试代码改成无限循环的,里面也不要什么sleep了,就让它一直跑,一直不停的创建和销毁线程。 不用几分钟,内存是一直增 ...


谢谢你!
这个是我写的示例,不是真实的程序.
我按照你的意思写出无限循环的,运行一下就退出,这样内存在45M左右.(这时同时存在的线程在10个以下..)

如果我让线程sleep一秒钟后退出,创建10000个线程(当然有创建没有成功的),峰值内存会涨到3G, 在所有的线程都结束后,任然有42M左右的内存占用!

难道这四十多兆就没法释放了吗?程序刚启动的时候可只有3M哦
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP