什么时候分配静态数据(.bss)?

时间:2012-07-25 10:42:41

标签: c gcc elf

我一直在研究减少应用程序的内存占用量。继上一个问题之后:GDB - can I find large data elements in memory我找到并删除了大部分最大的罪魁祸首。

nm --size-sort非常宝贵,可以从可执行文件的.bss部分找到大项目。

pmap中查看的内存占用量大幅下降。但是当我在另一个系统(Ubuntu Pangolin,gcc 4.6.3)上继续这项工作时,我注意到运行进程的内存占用非常合理,而且肯定比.bss大小小得多。

通过调试器运行代码,看起来.bss部分中的最大符号在访问数据之前并没有真正分配(即我可以设置一个数组 来自其中一个大符号的元素,内存占用量增加了16MB)。

.bss部分只是零初始化,因此很容易想象一个实现为其分配虚拟地址空间,但实际上并没有分配任何实际内存,直到它被使用。

这是行为的真正差异,还是系统间报告的差异?

1 个答案:

答案 0 :(得分:3)

在Linux中,零初始化页面都映射到内存中相同的“归零”物理页面。使用写时复制方法,当您写入该页面的内存时,页面将被复制并重新映射到新页面,从而导致应用程序的内存占用增长。听起来像这是正在发生的事情,正如你所怀疑的那样。这适用于所有Linux发行版。