2

アプリケーションのメモリ フットプリントを削減することを検討しています。前の質問に続きます: GDB - メモリ内の大きなデータ要素を見つけることができますか? 私が見つけて、最大の原因のほとんどを削除しました。

nm --size-sort実行可能ファイルの .bss セクションから大きなアイテムを見つけることは非常に貴重でした。

pmap で表示されるメモリ フットプリントは、大幅に減少しました。しかし、別のシステム (Ubuntu Pangolin、gcc 4.6.3) でこの作業を続けているときに、実行中のプロセスのメモリ フットプリントが完全に合理的であり、.bss サイズよりもはるかに小さいことに気付きました。

デバッガーでコードを実行すると、.bss セクションの最大のシンボルは、データがアクセスされるまで実際には割り当てられていないようです (つまり、大きなシンボルの 1 つから配列要素を設定でき、メモリ フットプリントが 16MB 増加します)。 )。

.bss セクションはゼロで初期化されているだけなので、仮想アドレス空間を割り当てる実装を想像するのは簡単ですが、実際には使用されるまで実メモリを割り当てません。

これは実際の動作の違いですか、それともシステム間のレポートの違いですか?

4

1 に答える 1

3

Linux では、ゼロで初期化されたページはすべて、メモリ内の同じ「ゼロ化された」物理ページにマップされます。コピー オン ライト方式を使用すると、そのページのメモリに書き込むときに、ページがコピーされて新しいページに再マップされるため、アプリケーションのメモリ フットプリントが大きくなります。あなたが疑うように、これが起こっているように聞こえます。これは、すべての Linux ディストリビューションに当てはまります。

于 2012-07-25T11:28:48.257 に答える