multithreading - 如何识别进程中每个线程的内存消耗?
问题描述
用 C 编写的多线程进程几乎耗尽了所有系统内存。为了找出消耗大部分内存的线程,我制作了一个核心文件gcore [pid]
来检查每个线程的内存使用情况,但我找不到这样做的方法。
ps -eLFlm
带有-H选项的top 命令显示总内存消耗,但不是每个线程。
有什么有用的技巧可以解决这个问题吗?
操作系统:Centos6
解决方案
用 C 编写的多线程进程几乎耗尽了所有系统内存。找出消耗大部分内存的线程....
这个问题没有意义。根据定义,同一进程的所有线程共享相同的虚拟地址空间。您可以使用proc(5)以编程方式查询它(例如从您的程序中读取/proc/self/maps
)。
有可能(并且很常见)在线程 A 中分配了一些堆内存(例如,使用),并且稍后会在其他线程 B(通常是主线程,就在退出之前)malloc
中释放(例如-d)。free
根据定义, C动态内存管理堆是一个完整的程序属性。
一个典型的例子是pthread_create(3)arg
的最后一个参数。它通常应该是堆分配的。您可以记录并采用调用线程(使用)的约定,但创建的线程应该是它(您可以要求每个传递给should that )。pthread_create
malloc
free
start_routine
pthread_create
free
arg
有什么有用的技巧可以解决这个问题吗?
也许valgrind可以帮助您找到内存泄漏。您最好使用DWARF调试信息(例如 compile with gcc -g
)编译所有程序(可能还有一些相关的库),然后重新启动程序。但是这样的错误很难找到,所以要准备好花几个星期的时间来解决它们。
从概念的角度来看,垃圾收集的“理论” (以及智能指针、RAII,也许是引用计数等)可能会有所帮助。所以请阅读GC 手册(它介绍了好的概念和术语,并解释了内存管理是整个程序问题)。许多概念甚至与非 GC 语言(如 C 或 C++)中的程序相关。
您需要定义并遵循一些关于内存管理的足够好的整个程序约定(这很困难)。
推荐阅读
- flutter - 如何在颤动中推动替换删除整个导航堆栈?
- php - Wordpress 如何将评论从默认(一个空的文本框)更改为另一个带有一些固定文本的评论?
- python - 使用python列表时丢失字符串
- javascript - Keycloak 自定义身份验证器脚本 - 如何在脚本上下文中获取用户的访问令牌或外部 idp 令牌?
- javascript - React 状态值在传递给模型时变为 null
- javascript - 使用 shopify 产品页面设置后付款 - 不显示
- asp.net-core - .net core 3.1 中的 RazorLight 布局问题
- python - Python 中的 ssl 模块在 macos 上不可用
- python - 使用一个熊猫数据框填充另一个熊猫数据框中的新列
- javascript - 如何将 json 值传递到 rails 渲染部分