如何确定进程中每个线程的内存消耗?

박영길*_*박영길 6 memory multithreading ps

用C编写的多线程进程几乎耗尽了所有的系统内存。为了找出消耗大部分内存的线程,我创建了一个核心文件gcore [pid]来检查每个线程的内存使用情况,但我找不到方法来做到这一点。

ps -eLFlm带有-H选项的 top 命令显示总内存消耗,但不是每个线程。

有什么有用的提示可以解决问题吗?

操作系统:Centos6

Bas*_*tch 3

用C编写的多线程进程几乎耗尽了所有的系统内存。找出消耗大部分内存的线程......

这个问题没有意义。根据定义,同一进程的所有线程共享相同的虚拟地址空间您可以使用proc(5)以编程方式查询它(例如从程序中读取)。/proc/self/maps

有可能(并且很常见)一些堆内存在线程 A 中分配(例如使用),并且稍后在其他线程 B(通常是主线程,就在退出之前)中malloc释放(例如-d)。free

根据定义, C动态内存管理堆是整个程序的属性。

一个典型的例子是pthread_create(3)arg的最后一个参数。它通常应该是堆分配的。您可以记录并采用这样的约定:调用线程(使用的线程)会这样做,但创建的线程应该这样做(您可以要求每个传递给的线程都应该这样做)。pthread_createmallocfreestart_routinepthread_createfreearg

有什么有用的提示可以解决问题吗?

也许valgrind可以帮助您发现内存泄漏您最好使用DWARF调试信息(例如使用 编译 来编译所有程序(也许还有一些相关的库),gcc -g然后重新启动您的程序。但此类错误很难发现,因此请准备好花费数周的时间来解决它们。


从概念的角度来看,垃圾收集的“理论” (还有智能指针RAII、也许引用计数等)可能会有所帮助。因此,请阅读GC手册(它介绍了很好的概念和术语,并且解释了内存管理是一个整体程序问题)。其中许多概念甚至与非 GC 语言(如 C 或 C++)中的程序相关。

您需要定义并遵循一些有关内存管理的足够好的整个程序约定(这很困难)。