私のアプリケーションは、作業を実行するために大量のメモリと大きなデータ構造を必要とします。 多くの場合、アプリケーションには1 GB以上のメモリが必要です。場合によっては、数ギガバイトのメモリがあるため、アプリケーションの64ビット版を実際に使用する必要があります。メモリに最小限の断片化が生じるように、WindowsにDLLをロードするように強制します。
以前は、メモリが1.6〜1.7 GBのメモリ使用量に達した場合、「メモリ不足」または「メモリ不足」の状況に近いことをユーザに簡単に説明できました。メモリを減らしたり、64ビット版に移行することができます。
昨年私は、アプリケーションがすでにメモリ不足になる前に約1GBしか使用しないことに気付きました。いくつかの調査の後、この問題の原因はメモリ断片化であるように見えました。私はアプリケーションのメモリ使用量を見るためにVMMAP(SysInternalsユーティリティ)を使いました。このようなものを見ました:
オレンジ色の領域は私のアプリケーションによって割り当てられたメモリです。紫色の部分は実行可能なコードです。
イメージの下半分に表示されているように、紫色の領域(DLL)は多くの異なるアドレスに読み込まれ、メモリが断片化する原因となります。私の顧客が多くのデータを持っていない場合は問題にはなりませんが、顧客が1 GBを超えるデータセットを持ち、アプリケーションの一部に大きなブロック(50 MBなど)が必要な場合は、メモリ割り当てに失敗し、アプリケーションがクラッシュする可能性があります。
ほとんどのデータ構造はSTLベースであり、多くの場合連続したメモリを必要としませんが、場合によっては(非常に大きな文字列など)、連続したメモリブロックが必要です。残念ながら、そのような連続したメモリブロックを必要としないようにコードを変更することは必ずしも可能ではありません。
質問は以下のとおりです。
- どのように私は、DLLのは、明示的に顧客のコンピュータ上のすべてのDLLの上REBASEを使用せずに、または明示的にすべてのDLLのをロードすることなく、メモリにロードされている場所に影響を与えることができます。
- 独自のアプリケーションマニフェストファイルにDLLのロードアドレスを指定する方法はありますか?
- また、Windowsに(マニフェストファイル経由で)DLLを分散させないように指示する方法があります(この散乱はASLRと呼ばれています)。
もちろん、私がアプリケーションのマニフェストファイル内で影響を与えることができる解決策は、WindowsのDLLの自動/動的ロードに依存しているからです。
私のアプリケーションは、混合モード(管理対象+非管理)アプリケーションですが、アプリケーションの大部分は管理対象外です。
誰か提案がありますか?
これはあなたを助けるかもしれませんか? http://msdn.microsoft.com/en-us/library/f7f5138s.aspx – detunized
mmm、本当に同時に大量のメモリが必要ですか? Process Monitorはログを仮想メモリに保存し、必要に応じてプロセスのメモリアドレス空間にデータを持ち込むだけです。http://blogs.msdn.com/b/oldnewthing/archive/2004/08/10/211890.aspxでコードを確認してください例 –
答えを残している皆さんがASLRの成果を理解しているかどうかはわかりません:http://en.wikipedia.org/wiki/ASLR –