2

我一直在研究减少应用程序的内存占用。继上一个问题之后:GDB - 我可以在内存中找到大型数据元素吗?我已经找到并删除了大多数最大的罪魁祸首。

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

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

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

.bss 部分只是零初始化,所以很容易想象一个实现为它分配虚拟地址空间,但在使用它之前实际上不分配任何实际内存。

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

4

1 回答 1

3

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

于 2012-07-25T11:28:48.257 回答