私のアプリケーションは、その作業を実行するために大量のメモリと大きなデータ構造を必要とします。多くの場合、アプリケーションは 1 GB を超えるメモリを必要とし、場合によっては、顧客が数ギガバイトのメモリを持っているため、実際には 64 ビット バージョンのアプリケーションを使用する必要があります。
以前は、メモリが 1.6 ~ 1.7 GB のメモリ使用量に達した場合、それは「メモリ不足」または「メモリ不足」に非常に近い状況であり、メモリを削減する必要があることをユーザーに簡単に説明できました。または 64 ビット版に移行してください。
昨年、アプリケーションがメモリ不足になる前に約 1 GB しか使用しないことが多いことに気付きました。いくつかの調査の結果、この問題の原因はメモリの断片化であると思われました。VMMAP (SysInternals ユーティリティ) を使用してアプリケーションのメモリ使用量を調べたところ、次のような結果が得られました。
オレンジ色の領域は、アプリケーションによって割り当てられたメモリです。紫色の領域は実行コードです。
画像の下半分でわかるように、紫色の領域 (DLL の部分) がさまざまなアドレスにロードされているため、メモリが断片化されています。私の顧客が大量のデータを持っていない場合、これは実際には問題ではありませんが、私の顧客が 1 GB を超えるデータ セットを持っていて、アプリケーションの一部が大きなメモリ ブロック (50 MB など) を必要とする場合、メモリの割り当てに失敗し、アプリケーションがクラッシュする可能性があります。
私のデータ構造のほとんどは STL ベースであり、連続したメモリの大きなチャンクを必要としないことがよくありますが、場合によっては (非常に大きな文字列など)、メモリの連続したブロックが本当に必要になります。残念ながら、このような連続したメモリ ブロックを必要としないようにコードを変更できるとは限りません。
質問は次のとおりです。
- 顧客のコンピューター上のすべての DLL に対して明示的に REBASE を使用せずに、またはすべての DLL を明示的にロードせずに、DLL がメモリにロードされる場所に影響を与えるにはどうすればよいでしょうか。
- 独自のアプリケーション マニフェスト ファイルで DLL のロード アドレスを指定する方法はありますか?
- または、(マニフェスト ファイルを介して) Windows に DLL を分散させないように指示する方法はありますか (この分散は ASLR と呼ばれていると思います)。
もちろん、Windows による DLL の自動/動的ロードに依存しているため、アプリケーションのマニフェスト ファイル内から影響を与えることができるソリューションが最適です。
私のアプリケーションは混合モード (マネージド + アンマネージド) アプリケーションですが、アプリケーションの大部分はアンマネージドです。
誰の提案ですか?