2012-07-25 50 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