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

标签 multithreading memory ps

用 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_createfree )。

Is there any useful tip to solve the problem?



也许 valgrind可能会帮助您找到您的 memory leaks .你最好用 DWARF 编译你所有的程序(也许还有一些相关的库)调试信息(例如编译 with arg )然后重新启动你的程序。但是这样的错误很难找到,所以准备好花几个星期的时间来研究它们。

从概念上看garbage collection的“理论” (还有 smart pointersRAII ,也许 reference counting 等...)可能会有所帮助。所以阅读 GC handbook (它介绍了好的概念和术语,并解释了内存管理是一个整个程序的问题)。许多概念甚至与非 GC ed 语言(如 C 或 C++)中的程序相关。

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

关于multithreading - 如何确定进程中每个线程的内存消耗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52601090/

相关文章:

c# - await/async 与线程有何不同?

Java加速进程/线程

c# - 在一个Producer和Multi-Consumer实现中等待所有Consumer都处于waiting状态

c++ - 当键分配字符串时,Map 是否有优化版本?

multithreading - 如何确定 Matlab 使用的线程数?

Java ConcurrentHashMap 原子获取和放置

c - 在 C 中以 64 位平台为目标时,对数组引用使用 64 位变量是否更好?

java - 当堆栈值不在顶部时,如何解析它们?

python - linux下无法杀死进程

linux - 您会得到 'aux ps' 输出,其中仅打开 1 个终端,并且 a.out 执行了 2 次,但您只调用了一次。趋势中的一些东西