首页 > 解决方案 > 如何识别进程中每个线程的内存消耗?

问题描述

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

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

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

操作系统:Centos6

标签: multithreadingmemoryps

解决方案


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

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

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

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

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

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

也许valgrind可以帮助您找到内存泄漏。您最好使用DWARF调试信息(例如 compile with gcc -g)编译所有程序(可能还有一些相关的库),然后重新启动程序。但是这样的错误很难找到,所以要准备好花几个星期的时间来解决它们。


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

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


推荐阅读