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

时间:2018-10-02 02:02:59

标签: multithreading memory ps

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

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

有什么有用的技巧可以解决问题吗?

OS:Centos6

1 个答案:

答案 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 pointersRAII,也许还有reference counting等)的“理论”可能会有所帮助。因此,请阅读GC handbook(它正在介绍好的概念和术语,并且它说明内存管理是整个程序的问题)。许多概念甚至与非GC版本的语言(例如C或C ++)有关。

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