用 C 编写的多线程进程几乎耗尽了所有系统内存。为了找出消耗大部分内存的线程,我使用 gcore [pid]
创建了一个核心文件检查每个线程的内存使用情况,但我找不到这样做的方法。ps -eLFlm
和带有 -H 选项的 top 命令显示总内存消耗,但不是每个线程。
有什么有用的提示可以解决问题吗?
操作系统:Centos6
最佳答案
A multi-thread process written in C exhausts almost all of system memory. To find out the thread which is consuming most of the memory....
这个问题没有意义。根据定义,同一进程的所有线程共享相同的 virtual address space .您可以使用 proc(5) 以编程方式查询它(例如 reading
/proc/self/maps
来自您的程序)。有可能(而且很常见)在线程 A 中分配了一些堆内存(例如使用
malloc
),稍后会在其他一些线程 B(通常是主线程,只是退出前)。C dynamic memory management根据定义,堆是整个程序的属性。
一个典型的例子是最后一个
free
论据 pthread_create(3) .它通常应该是堆分配的。您可以记录并采用调用线程(使用 arg
的线程)将 pthread_create
的约定。它,但创建的线程应该 malloc
它(你可以要求每个 free
传递给 start_routine
应该 pthread_create
那 free
)。Is there any useful tip to solve the problem?
也许 valgrind可能会帮助您找到您的 memory leaks .你最好用 DWARF 编译你所有的程序(也许还有一些相关的库)调试信息(例如编译 with
arg
)然后重新启动你的程序。但是这样的错误很难找到,所以准备好花几个星期的时间来研究它们。从概念上看garbage collection的“理论” (还有 smart pointers , RAII ,也许 reference counting 等...)可能会有所帮助。所以阅读 GC handbook (它介绍了好的概念和术语,并解释了内存管理是一个整个程序的问题)。许多概念甚至与非 GC ed 语言(如 C 或 C++)中的程序相关。
您需要定义并遵循一些关于内存管理的足够好的整个程序约定 (这很困难)。
关于multithreading - 如何确定进程中每个线程的内存消耗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52601090/