3

私のプログラムでは、演算子 new を使用して約 130 メガバイトを割り当て、例外がスローされますが、タスク マネージャーで 800 メガバイト以上が使用可能であることがわかりました。タスク マネージャーで使用可能として示されている物理メモリと、プログラムで使用できるメモリとの関係を知りたいです。

もう 1 つの理由は、メモリの断片化です。メモリ割り当てを要求すると、メモリが連続している必要があります。そのような連続したメモリが存在するかどうかを知る方法はありますか?

4

2 に答える 2

4

物理メモリ <> 仮想メモリ。

32 ビット アプリケーションを実行している場合は、最大 2 GB のメモリをアドレス指定できます (32 ビット OS 上)。マシンに 32 GB の物理メモリがある場合でも、2 GB に制限されます。マシンの物理メモリの量が最小限である場合 (128 MB の物理メモリがあった時代を覚えていますか?)、または他の多くのアプリケーションを実行している場合、サイズは 2 GB 未満になる可能性があります (ページ ファイル全体が必要です)。すべてのアプリケーション間で分割されます)。

2 GB のメモリがあっても、130 MB の連続したブロックが利用できない場合、130 MB の割り当ては失敗する可能性があります。Windows Vista 以降、DLL はアドレス空間全体にランダムに分散されており (ASLR を探してください)、(私の経験では) 多くのメモリの断片化を引き起こしているようです。

あなたの問題にはいくつかの解決策があります:

  • 実行しているシステムを制御できる場合は、システムの ASLR を無効にすることができます。商用ソフトウェアを販売している場合は、これを行わないでください。あなたの顧客はこれを受け入れません。
  • 32 ビット アプリが 64 ビット システムで実行されている場合は、アプリケーションに /LARGEADDRESSAWARE フラグを指定します (リンカー フラグまたは editbin ユーティリティを参照してください)。このフラグを使用すると、アプリケーションは 2 GB ではなく 4 GB をアドレス指定できるようになります。これは、ポインターを使用して「汚い」ことをしていないことが確実な場合にのみ行ってください (たとえば、無関係なポインターへの減算など)。
  • 1 つの大きなブロックではなく、小さなメモリを割り当てます。1 つの大きなブロックが必要であるという事実を抽象化します (たとえば、この大きなブロックの周りにクラスを記述します)。

可能であれば、最後の選択肢を選びます。

于 2012-04-23T13:06:48.323 に答える
0

私はあなたがWindowsを使用していると仮定しています。利用可能な RAM の量は、new がメモリを割り当てられるかどうかとは関係ありません。プロセスの仮想メモリで 130 MB の連続した仮想メモリ ブロックを使用できるかどうかによって異なります。RAM は、OS が非常に高速に読み書きできる限られたスクラッチ パッドと考えてください。ただし、探しているものがスクラッチで利用できない場合は、ディスクに移動してスクラッチ パッドに書き込みます。

于 2012-04-23T12:57:10.453 に答える