我正在使用 RHEL 6.3(64 位)。 我在我的多线程 c/c++ 程序中做了一些更改(使用 std:map 来满足特定要求),现在我的项目的初始虚拟内存使用率已经非常高(大约 900m)。我所做的所有更改都受到 MACRO 的保护。
但是在禁用 MACRO 之后,我也看不到进程的虚拟内存使用量有任何减少。
所以我有几个问题要问。
有什么方法可以找出哪个线程正在消耗最大虚拟内存,以便我可以隔离问题?
为什么禁用宏后我进程的虚拟内存使用量没有下降?
同一项目在 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/