【发布时间】:2023-03-07 23:16:01
【问题描述】:
考虑以下 C 程序,“pause.c”:
void main() { pause(); }
在 x64 Linux 3.0.0-16-generic 上使用此命令 'gcc -Os pause.c -o pause' 编译它会生成大小约为 8KB 的可执行文件。当我运行这个可执行文件并使用“pmap -d PID”检查它的精确内存占用时,它显示分配给进程的私有内存为 192KB(通常在不同系统之间变化,在 128KB 和 192KB 之间)。
使用 valgrind 和 massif 检查进程未能检测到任何内存分配事件。我怀疑 192KB 的数字是否准确,但我发现启动 5 个“暂停”进程实例确实消耗了大约 1MB 的系统内存。
我无法解释这个内存的来源,谁能提供一些关于为什么分配这个内存以及任何可能减少它的潜在行动的见解?,干杯。
【问题讨论】:
-
首先检查 ELF 可执行文件;你会在那里找到很多东西(数据/代码部分、调试、cmets 等)。另请记住,您的程序至少与 libc 相关联;那里有很大的空间。
-
好的,二进制的基本大小是 8KB,pmap 实用程序将链接开销考虑在内,192KB 的数字仅来自程序本身,当链接开销为考虑过,但这是共享内存,不是问题
-
尝试摆脱 libc: void _start() { while (1) { } } 并使用 gcc -nostdlib pause.c 编译。这将减少内存使用量。
-
然后在运行二进制文件之前将堆栈大小限制为 12 个字节(ulimit -s 12)
-
啊,ulimit 命令成功了!,它已降至 12kb,显然占用空间主要是由默认堆栈分配造成的,请详细说明此效果,我会接受
标签: c linux memory memory-footprint