zoukankan      html  css  js  c++  java
  • Linux thread 泄露问题

    转:http://www.cnblogs.com/bits/archive/2009/12/04/no_join_or_detach_memory_leak.html 

    解决了一个隐蔽的内存泄漏——pthread_create后没有detach导致内存持续增长

    昨天解决了一个隐蔽的内存泄漏问题,原因是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 avoid memory leaks.

    也就说线程执行完后如果不join的话,线程的资源会一直得不到释放而导致内存泄漏!一时的图快后患无穷啊。

    解决办法

    复制代码
    代码
     1 // 最简单的办法,在线程执行结束后调用pthread_detach让他自己释放
     2 pthread_detach(pthread_self());
     3 
     4 
     5 // 或者创建线程前设置 PTHREAD_CREATE_DETACHED 属性
     6 pthread_attr_t attr;
     7 pthread_t thread;
     8 pthread_attr_init (&attr);
     9 pthread_attr_setdetachstate (&attrPTHREAD_CREATE_DETACHED);
    10 pthread_create (&thread, &attr&thread_function, NULL);
    11 pthread_attr_destroy (&attr);
    复制代码

    第2行的那种方法最简单,在线程函数尾部加上这句话就可以将线程所占用的资源给释放掉;或者像 5-11 所示的方法设置detach属性,这样也会在线程return/pthread_exit后释放内存。

    其实仔细想想,valgrind检查时已经提示了pthread_create没有释放的问题,只是之前没引起注意。其实这样的问题也只有在长时间运行时,慢慢积累这一点点的内存才会暴露出来,看来valgrind的提示也不能置之不理啊。

  • 相关阅读:
    org.springframework.beans.BeanUtils属性赋值 Date类型处理转换为LocalDateTime, Date不能直接赋值给LocalDateTime
    python rabbitmq官方文档demo
    rabbitmq安装
    python 文件查找及截取字符串 (替换,分割) demo
    python pika rabbitmq demo
    python xlrd excel读取操作
    python pymysql 数据库查询操作
    GO语言学入门学习,学习资料推荐
    linux安装uwsgi错误:gcc returned 1 exit status error: lto-wrapper failed collect2:
    anconda的使用以及在conda环境中使用pip和conda使用安装依赖的区别和注意事项
  • 原文地址:https://www.cnblogs.com/simonhaninmelbourne/p/2737690.html
Copyright © 2011-2022 走看看