put*_* ks 6 c memory memory-layout
需要对我的C应用程序进行内存分析..
它应该包括占用空间大小和RAM大小......
例如,如果我的应用程序如下所示..
#include <stdio.h>
int global = 10; /* initialized global variable */
int test_code(void)
{
static int i = 100; /* Initialized static variable*/
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
[putta@linux]$ gcc memory-layout.c -c memory-layout
[putta@linux]$ ls -ltrh memory-layout.o
760 Nov 9 18:26 memory-layout
[putta@linux]$ size memory-layout.o
text data bss dec hex filename
67 8 0 75 4b memory-layout.o
Run Code Online (Sandbox Code Playgroud)
那么现在我应该考虑哪些内存用于分析足迹,以及加载程序时的RAM.
以下分析是正确的吗?占用内存= 760(即闪存或硬盘)RAM = 67 + 8 + 0 = 75字节
需要专家建议
如果要了解磁盘上程序的大小以及RAM中文本和数据的大小,请在Linux / Unix上使用size命令:
$> size /bin/cat
text data bss dec hex filename
43422 1720 2472 47614 b9fe /bin/cat
Run Code Online (Sandbox Code Playgroud)
size的输出是目标文件不同部分的内存大小:
最后两列dec和hex分别是其他三列的总和(十进制和十六进制)。
您要求的大小是:ls的输出(给出磁盘上的大小)加上size命令的输出dec部分(得出RAM上的大小)。
另请参阅以下帖子:http : //www.cyberciti.biz/faq/linux-find-size-of-text-data-segment-bss-uninitialized-data/,如何知道我的二进制可执行文件的内存占用量
当引用软件应用程序时,占用空间指示正在运行的进程消耗的内存大小(运行时内存要求)。
话虽如此,很明显,当进程运行时,您应该检查内存占用量。我认为(和其他帖子证实了这一点),唯一真正的选择是使用valgrind这样的工具。
用valgrind分析您的应用程序
您可以使用Massif工具分析内存。Massif是堆分析器,但也可以测量堆栈的大小。
valgrind --tool = massif --stacks =是
这将使您同时使用堆和堆栈内存。然后将信息存储在文件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
Run Code Online (Sandbox Code Playgroud)
详细信息存储在文件中的不同表中。要完全了解输出,请参阅Valgrind手册页,该页看起来确实很清楚。
跟踪子项的选项是: --trace-children=yes
有趣的是,似乎没有“ 进程的实际内存使用情况 ”:https : //unix.stackexchange.com/questions/164653/actual-memory-usage-of-a-process。