【问题标题】:When is static data (.bss) allocated?何时分配静态数据 (.bss)?
【发布时间】:2012-07-25 10:42:41
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: c gcc elf


    【解决方案1】:

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

    【讨论】:

    • 这听起来很合理。我想你不知道这已经持续了多久?我看到显示巨大内存占用的系统是 2007 年时代 (SLES 10.1)。
    • Linux 已经处理这样的零页很长时间了。 Linux 2.4 中存在共享的 ZERO_PAGE,页错误处理程序中的写时复制支持也是如此。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多