2012-07-25 21 views
2

我一直在寻找减少应用程序的内存占用。继上一个问题之后:GDB - can I find large data elements in memory我找到并删除了大部分最大的罪魁祸首。何时分配静态数据(.bss)?

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

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

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

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

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

回答

3

在Linux中,零初始化页面全部映射到内存中相同的“归零”物理页面。使用写时复制方法,当您写入该页面的内存时,页面会被复制并重新映射到新页面,这反过来会导致应用程序的内存占用量增加。听起来像这样,就像你怀疑的那样。这将适用于所有Linux发行版。

+0

这听起来很合理。我不认为你知道这会持续多久?我看到显示巨大内存占用的系统是2007年代(SLES 10.1)。 – asc99c 2012-07-25 12:20:59

+0

Linux已经很长时间处理了这样的零页面。共享的ZERO_PAGE存在于Linux 2.4中,正如页面错误处理程序中的写入时复制支持一样。 – ncultra 2012-07-25 15:13:28