박영길*_*박영길 6 memory multithreading ps
用C编写的多线程进程几乎耗尽了所有的系统内存。为了找出消耗大部分内存的线程,我创建了一个核心文件gcore [pid]来检查每个线程的内存使用情况,但我找不到方法来做到这一点。
ps -eLFlm带有-H选项的 top 命令显示总内存消耗,但不是每个线程。
有什么有用的提示可以解决问题吗?
操作系统:Centos6
用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++)中的程序相关。
您需要定义并遵循一些有关内存管理的足够好的整个程序约定(这很困难)。
| 归档时间: |
|
| 查看次数: |
14122 次 |
| 最近记录: |