如何找出我的 linux 应用程序的内存占用?

Posted

技术标签:

【中文标题】如何找出我的 linux 应用程序的内存占用?【英文标题】:How to find out the memory footprint of my linux application? 【发布时间】:2015-02-11 09:21:19 【问题描述】:

我正在开发一个在 linux 上作为守护进程运行的 c 应用程序。

我的应用程序正在加载 3 个共享库 (*.so)。并且有时它会执行一个 shell 脚本。

在计算我的足迹时是否应该考虑脚本外壳和 3 个共享库?

如何找出我的应用程序的内存占用?

编辑

是否可以从/proc/$pid/maps 中提取足迹?

root@Linux:~# cat /proc/25998/maps
00400000-00412000 r-xp 00000000 1f:00 2823       /usr/sbin/mydaemond
00422000-00423000 rw-p 00012000 1f:00 2823       /usr/sbin/mydaemond
005a9000-005db000 rwxp 00000000 00:00 0          [heap]
76bd3000-76bd4000 ---p 00000000 00:00 0
76bd4000-76dd3000 rw-p 00000000 00:00 0          [stack:26009]
76dd3000-76dd4000 ---p 00000000 00:00 0
76dd4000-76fd3000 rw-p 00000000 00:00 0          [stack:26008]
76fd3000-76fd4000 ---p 00000000 00:00 0
76fd4000-771d3000 rw-p 00000000 00:00 0          [stack:26007]
771d3000-771d4000 ---p 00000000 00:00 0
771d4000-773d3000 rw-p 00000000 00:00 0          [stack:26006]
773d3000-773d4000 ---p 00000000 00:00 0
773d4000-775d3000 rw-p 00000000 00:00 0          [stack:26005]
775d3000-775d6000 r-xp 00000000 1f:00 799        /lib/libdl-0.9.33.2.so
775d6000-775e5000 ---p 00000000 00:00 0
775e5000-775e6000 r--p 00002000 1f:00 799        /lib/libdl-0.9.33.2.so
775e6000-775e7000 rw-p 00003000 1f:00 799        /lib/libdl-0.9.33.2.so
775e7000-775f9000 r-xp 00000000 1f:00 1436       /usr/lib/libz.so.1.2.7
775f9000-77608000 ---p 00000000 00:00 0
77608000-77609000 rw-p 00011000 1f:00 1436       /usr/lib/libz.so.1.2.7
77609000-7764e000 r-xp 00000000 1f:00 1402       /usr/lib/libssl.so.1.0.0
7764e000-7765e000 ---p 00000000 00:00 0
7765e000-77662000 rw-p 00045000 1f:00 1402       /usr/lib/libssl.so.1.0.0
77662000-77781000 r-xp 00000000 1f:00 1253       /usr/lib/libcrypto.so.1.0.0
77781000-77790000 ---p 00000000 00:00 0
77790000-777a1000 rw-p 0011e000 1f:00 1253       /usr/lib/libcrypto.so.1.0.0
777a1000-777a2000 rw-p 00000000 00:00 0
777a2000-77806000 r-xp 00000000 1f:00 808        /lib/libuClibc-0.9.33.2.so
77806000-77815000 ---p 00000000 00:00 0
77815000-77816000 r--p 00063000 1f:00 808        /lib/libuClibc-0.9.33.2.so
77816000-77817000 rw-p 00064000 1f:00 808        /lib/libuClibc-0.9.33.2.so
77817000-7781d000 rw-p 00000000 00:00 0
7781d000-77830000 r-xp 00000000 1f:00 801        /lib/libgcc_s.so.1
77830000-77840000 ---p 00000000 00:00 0
77840000-77841000 rw-p 00013000 1f:00 801        /lib/libgcc_s.so.1
77841000-77849000 r-xp 00000000 1f:00 1329       /usr/lib/libjson-c.so.2.0.1
77849000-77858000 ---p 00000000 00:00 0
77858000-77859000 rw-p 00007000 1f:00 1329       /usr/lib/libjson-c.so.2.0.1
77859000-7785a000 r-xp 00000000 1f:00 1331       /usr/lib/libjson.so.0.1.0
7785a000-77869000 ---p 00000000 00:00 0
77869000-7786a000 rw-p 00000000 1f:00 1331       /usr/lib/libjson.so.0.1.0
7786a000-7787d000 r-xp 00000000 1f:00 804        /lib/libpthread-0.9.33.2.so
7787d000-7788c000 ---p 00000000 00:00 0
7788c000-7788d000 r--p 00012000 1f:00 804        /lib/libpthread-0.9.33.2.so
7788d000-7788e000 rw-p 00013000 1f:00 804        /lib/libpthread-0.9.33.2.so
7788e000-77890000 rw-p 00000000 00:00 0
77890000-778d5000 r-xp 00000000 1f:00 1255       /usr/lib/libcurl.so.4.3.0
778d5000-778e4000 ---p 00000000 00:00 0
778e4000-778e6000 rw-p 00044000 1f:00 1255       /usr/lib/libcurl.so.4.3.0
778e6000-778f0000 r-xp 00000000 1f:00 1346       /usr/lib/libmicroxml.so.1.0
778f0000-778ff000 ---p 00000000 00:00 0
778ff000-77900000 rw-p 00009000 1f:00 1346       /usr/lib/libmicroxml.so.1.0
77900000-77904000 r-xp 00000000 1f:00 810        /lib/libubus.so
77904000-77913000 ---p 00000000 00:00 0
77913000-77914000 rw-p 00003000 1f:00 810        /lib/libubus.so
77914000-7791b000 r-xp 00000000 1f:00 809        /lib/libubox.so
7791b000-7792a000 ---p 00000000 00:00 0
7792a000-7792b000 rw-p 00006000 1f:00 809        /lib/libubox.so
7792b000-77934000 r-xp 00000000 1f:00 811        /lib/libuci.so
77934000-77943000 ---p 00000000 00:00 0
77943000-77944000 rw-p 00008000 1f:00 811        /lib/libuci.so
77944000-7794b000 r-xp 00000000 1f:00 793        /lib/ld-uClibc-0.9.33.2.so
77957000-7795a000 rw-p 00000000 00:00 0
7795a000-7795b000 r--p 00006000 1f:00 793        /lib/ld-uClibc-0.9.33.2.so
7795b000-7795c000 rw-p 00007000 1f:00 793        /lib/ld-uClibc-0.9.33.2.so
7fb30000-7fb51000 rwxp 00000000 00:00 0          [stack]
7fff7000-7fff8000 r-xp 00000000 00:00 0          [vdso]

【问题讨论】:

也许这有用:***.com/questions/1401359/… 【参考方案1】:

对于二进制文件,valgrind 的massif 工具非常有用。为了帮助处理数据,我还推荐massif-visualizer。使用这些工具,您可以找到哪些函数正在分配内存以及它们在任何特定时间拥有多少内存。

鉴于您的应用程序旨在作为守护程序运行,最重要的考虑因素是内存使用量在其整个生命周期内保持不变。

【讨论】:

【参考方案2】:

您应该考虑共享库: https://en.wikipedia.org/wiki/Memory_footprint

【讨论】:

以上是关于如何找出我的 linux 应用程序的内存占用?的主要内容,如果未能解决你的问题,请参考以下文章

linux 查看每个应用占用内存情况

如何找出我的记忆去向

Linux中是谁占用了我的端口

Linux下如何查看哪个进程占用内存多?

为啥 Linux 报告我的应用程序的内存使用量太大?

Linux下找出吃内存的方法总结