查找对象的内存大小
如果你想知道你的程序在磁盘上的大小加上文本和数据在 RAM 中的大小,在 Linux/Unix 上你可以使用 size 命令:
$> size /bin/cat
text data bss dec hex filename
43422 1720 2472 47614 b9fe /bin/cat
size 的输出是目标文件不同部分的内存大小:
-
文本:(代码段)可执行指令
-
数据:(数据段)初始化的全局变量
-
bss:(由符号开始的块)静态分配的变量
最后两列 dec 和 hex 分别是其他三列(整体大小)的十进制和十六进制之和。
您要求的大小是:ls 的输出(为您提供磁盘上的大小)加上 输出的 dec 部分size 命令,为您提供 RAM 上的大小。
另请参阅以下帖子:http://www.cyberciti.biz/faq/linux-find-size-of-text-data-segment-bss-uninitialized-data/、how to know the memory footprint of my binary executable
查找内存占用
当提到软件应用程序时,footprint 表示正在运行的进程所消耗的内存大小(运行时内存要求)。
也就是说,很明显你应该在进程运行时检查内存占用。我认为(和其他 posts 确认)唯一真正的选择是使用像 valgrind 这样的工具。
使用 valgrind 分析您的应用程序
您可以使用 Massif 工具分析内存。 Massif 是一个 heap 分析器,但也可以测量 stack 的大小。
valgrind --tool=massif --stacks=yes
这将为您提供 heap 和 stack 内存使用情况。
然后将信息存储在文件massif.out.????
你可以用
阅读
ms_print massif.out.?????
文件中的第一个输出是运行时内存使用情况的漂亮图表。
--------------------------------------------------------------------------------
Command: ./myprog -f d5.ini
Massif arguments: --stacks=yes
ms_print arguments: massif.out.24377
--------------------------------------------------------------------------------
MB
5.292^ ##
| @ : : @@ : : # :::: : :
| @:::: :: : :@:@@::::::::::::@ :::::::::::::# ::::@::::@::::::::
| @:: ::: :::::::::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@::::::::
| @:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@::::::::
| @:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@::::::::
| @:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@::::::::
| @:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@::::::::
| @:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@::::::::
| @:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@::::::::
| @@:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@::::::::
| @@:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@::::::::
| ::@@:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@::::::::
| : @@:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@::::::::
| : @@:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@::::::::
| : @@:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@::::::::
| : @@:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@::::::::
| : @@:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@::::::::
| : @@:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@::::::::
| : @@:: ::: : :::: ::@:@ ::: :: :::: @ :: ::: ::::::# ::::@: ::@::::::::
0 +----------------------------------------------------------------------->Gi
0 1.030
详细信息存储在文件中的不同表中。
要完全理解输出,请参阅 Valgrind 手册page,这似乎很清楚。
跟踪孩子的选项是:--trace-children=yes
有趣的是,似乎没有“进程的实际内存使用情况”:
https://unix.stackexchange.com/questions/164653/actual-memory-usage-of-a-process.