c++ - 有没有办法查看每个线程进程的虚拟内存使用情况?

标签 c++ c linux multithreading memory

我正在使用 RHEL 6.3(64 位)。 我在我的多线程 c/c++ 程序中做了一些更改(使用 std:map 来满足特定要求),现在我的项目的初始虚拟内存使用率已经非常高(大约 900m)。我所做的所有更改都受到 MACRO 的保护。

但是在禁用 MACRO 之后,我也看不到进程的虚拟内存使用量有任何减少。

所以我有几个问题要问。

  1. 有什么方法可以找出哪个线程正在消耗最大虚拟内存,以便我可以隔离问题?

  2. 为什么禁用宏后我进程的虚拟内存使用量没有下降?

  3. 同一项目在 32 位 (RHEL-6.3) 上占用的虚拟内存非常少(大约 150m)。 几乎比 64 位操作系统少 6 倍。为什么?

    我使用 top 命令查看虚拟内存使用情况。

最佳答案

你可能应该使用 valgrind打猎memory leaks .当然,使用调试信息和警告编译所有程序(例如 g++ -Wall -g)。最近 GCC x86-64 上的编译器(例如 gcc-4.9 )您还可以使用地址清理器 (-fsanitize=address)

当运行(测试)你的程序时,你可以使用 pmap(1)查询其地址空间。另见 proc(5) .也试试 htop .在 64 位系统上对原始程序(未经您的任何修改)进行基准测试。

我希望您使用的是 version control system喜欢git关于您的代码和您的修改。

根据定义,address space process 中的所有线程都是通用的.认为某些特定的线程正在消耗内存是错误的——它是进程本身(即正在运行的程序中的任何线程)。

也许你想为 x32 ABI 编译.

顺便说一句,每个线程都需要一些内存(用于堆栈、TLS 等)——这当然对其他线程可见,例如如果你在其中传递一些指针 - 并且可能在 64 位上比在 32 位上更多。你有多少线程? (您可能应该避免拥有超过一打的线程)。

关于c++ - 有没有办法查看每个线程进程的虚拟内存使用情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25035722/

相关文章:

C++根据重量计算运费

java - 在C++和Java内存模型的上下文中,单线程程序是否存在唯一的合法/有效执行?

c - void function(stuct *s) 与 void function(stuct s) 有什么区别?

c - 读取设备数据流时缺少流量控制数据 (0x13)

ruby - 我无法在 cygwin 上启动 Chef

linux - 在 netbeans 中部署 java 桌面应用程序

c++ - 序列化 lua_State 以通过网络发送

c++ - 错误 : expression cannot be used as function - operator()

c - UNIX 网络编程中的前缀是什么意思?

linux - 在先前不支持 802.1x 身份验证的设备中支持 802.1x 身份验证