3

malloc繰り返し呼び出すことでメモリをリークする、迅速で汚いプログラムを作成しました。プログラムをデバッグ構成(VS 2012)で実行すると、プログラムがギガバイトのメモリを正しく消費し、ページファイルがいっぱいになるまで続行することに気付きました(Windowsタスクマネージャーが高いワーキングセットサイズを報告します)。ただし、プログラムをリリースモードで実行すると、プログラムのワーキングセットサイズは小さいままですが、コミットサイズは大きくなり続けます。また、ディスクのスラッシングやページの障害も著しく少なくなります。

MSDNのドキュメントには、デバッグモードの場合mallocはにマップされると_malloc_dbg記載されていますが、両方ともヒープにメモリを割り当て、デバッグ情報用に追加のメモリのみを_malloc_dbg割り当てると記載されています-異なるヒープ動作については言及されていません(つまり、そうでない理由)リリースモードのプライベートワーキングセットに表示されます)。

何が起こっているのか教えてください

4

1 に答える 1

5

仮想メモリページがコミットされると、ページにアクセスするまで物理メモリは割り当てられません。

デバッグmallocは、新しく割り当てられたメモリを既知のパターンで埋めますが、リリースmallocはそれを初期化しません。

初期化の結果、リリースよりもデバッグで必要な物理RAMのページ数が多くなります(スラッシングも多くなります)。

割り当てられたメモリのすべてのページに実際に触れるとしたら、2つのビルドの違いのほとんどが消えると思います。

于 2013-03-23T18:42:22.937 に答える