用C编写的多线程进程几乎耗尽了所有的系统内存.为了找出占用大部分内存的线程,我使用gcore [pid]创建了一个核心文件来检查每个线程的内存使用情况,但我找不到这样做的方法。
ps -eLFlm和-H选项的top命令显示总的内存消耗,但不显示每个线程的内存消耗。
有什么有用的建议来解决这个问题吗?
OS : Centos6
发布于 2018-10-02 05:24:37
用C编写的多线程进程几乎耗尽了所有的系统内存.找出消耗大部分内存的线程.
这个问题没有道理。根据定义,相同进程的所有线程共享相同的虚拟地址空间。您可以使用proc(5) (例如,程序中的/proc/self/maps )以编程方式查询它。
在线程A中分配一些堆内存(例如,使用malloc)是可能的(也是相当常见的),然后在其他线程B中(通常是主线程,在退出之前)释放(例如free-d)。
根据定义,C 动态内存管理堆是一个完整的程序属性。
一个典型的例子是arg对创建(3)的最后一个参数。它通常应该被堆分配。您可以记录并采用这样的约定,即调用线程(使用pthread_create的线程)将对其进行malloc,但是所创建的线程应该将其转换为free (您可以要求每个start_routine传递给pthread_create应该对该arg进行free )。
有什么有用的建议来解决这个问题吗?
也许缬磨可以帮助您找到您的内存泄漏。您最好用矮人调试信息(例如编译使用 gcc -g)编译所有的程序(可能还有一些相关的库),然后重新启动程序。但是这样的虫子很难找到,所以要准备花几个星期在它们上。
从概念的角度来看,垃圾收集的“理论”(还有智能指针,雷伊,也许还有参考计数等等)可能会有帮助。所以请阅读GC手册 (它介绍了好的概念和术语,并解释了内存管理是一个完整的程序问题)。许多概念甚至与非GC语言(如C或C++ )中的程序相关。
您需要定义和遵循一些足够好的整体程序约定关于内存管理(这很困难)。
https://stackoverflow.com/questions/52601090
复制相似问题