用C编写的多线程进程几乎耗尽了所有系统内存。为了找出消耗大部分内存的线程,我使用gcore [pid]
制作了一个核心文件来检查每个线程的内存使用情况,但是我找不到解决方法。
ps -eLFlm
和带有 -H 选项的top命令显示总内存消耗,但不是每个线程。
有什么有用的技巧可以解决问题吗?
OS:Centos6
答案 0 :(得分:0)
用C编写的多线程进程几乎耗尽了所有系统内存。要找出占用大部分内存的线程。...
这个问题没有道理。根据定义,同一进程的所有线程共享相同的virtual address space。您可以使用proc(5)(例如,程序中的reading /proc/self/maps
)以编程方式对其进行查询。
有可能(而且很常见)在线程A中分配了一些堆内存(例如,用malloc
),并稍后在其他线程B中释放了(例如,free
-d) (通常是主线程,就在退出之前)。
根据定义,C dynamic memory management堆是整个程序属性。
一个典型的示例是pthread_create(3)的最后一个arg
参数。它通常应该是堆分配的。您可以记录并采用约定,即调用线程(使用pthread_create
的线程)将malloc
,但创建的线程应free
(它可以要求每个{{1 }}传递给start_routine
应该pthread_create
free
)。
有什么有用的技巧可以解决问题吗?
也许valgrind可以帮助您找到memory leaks。您最好使用DWARF调试信息(例如,编译with arg
)来编译所有程序(甚至一些相关的库),然后重新启动程序。但是这类错误很难找到,因此请准备好花几个星期的时间。
从概念上讲,garbage collection(以及smart pointers,RAII,也许还有reference counting等)的“理论”可能会有所帮助。因此,请阅读GC handbook(它正在介绍好的概念和术语,并且它说明内存管理是整个程序的问题)。许多概念甚至与非GC版本的语言(例如C或C ++)有关。
您需要定义并遵循一些关于内存管理的足够好的整个程序约定 (这很困难)。