実際の質問から始める前に、ここで詳細の一部が間違っている可能性があるとだけ言っておきます。もしそうなら、それらだけでなく、あるいは私の質問に答える代わりに、私を逮捕してください。
私の質問は、基本的にDLLと.NETについてです。かなりのメモリを使用しているアプリケーションがあり、特に問題が主にクライアントのコンピュータで発生している場合に、これを正しく測定する方法を見つけようとしています。
私を驚かせたのは、ORMコードが生成されたかなり大きな.NETアセンブリがあることです。
一意のベースアドレスを持つアンマネージ(Win32)DLLを使用していた場合、同じマシン上の複数の同時プロセスがDLLを物理メモリに1回ロードし、すべてのアプリケーションの仮想メモリにマップするだけでした。したがって、物理メモリはこのDLLに1回使用されます。
問題は、.NETアセンブリで何が起こるかです。このDLLにはILが含まれており、この部分はアプリケーション間で共有される可能性がありますが、このILから生じるJITtedコードはどうでしょうか。共有されていますか?そうでない場合、これが実際に問題に寄与しているかどうかを把握するためにどのように測定しますか?(はい、私は知っています、それは貢献するでしょう、しかしそれが最大の問題になるまで私はこれに多くの時間を費やすつもりはありません)。
また、ソリューション内のすべての.NETアセンブリのベースアドレスを確認していないことも知っていますが、.NETアセンブリで確認する必要がありますか?もしそうなら、これらのアドレスを決定する方法について利用可能ないくつかのガイドラインはありますか?
これが大きな問題ではない、またはまったく問題ではないことが判明したとしても、この領域への洞察は大歓迎です。
編集:ちょうどこの質問を見つけました:私の質問に部分的に答える.NETアセンブリとDLLリベースですが、JITtedコードがこれらすべてにどのように影響するかを知りたいです。
その質問と受け入れられた回答から、JITtedコードはヒープに配置されているように見えます。つまり、各プロセスは共有バイナリアセンブリイメージをロードし、独自のメモリスペース内にコードのプライベートJITtedコピーを生成します。
これを測定する方法はありますか?これで大量のコードが生成されることが判明した場合は、生成されたコードをさらに調べて、調整する必要があるかどうかを判断する必要があります。
編集:ここに質問の短いリストを追加しました:
- .NETアセンブリのベースアドレスが一意で重複しないようにして、JITtingのためにILコードを取り出すために主に使用されるdllのリベースを回避することに意味はありますか?
- これが本当に問題であるかどうかを判断するために、JITtedコードに使用されているメモリの量をどのように測定できますか?
ここでの@BrianRasmussen の回答は、予想どおり、JITtingがJITtedコードのプロセスごとのコピーを生成することを示していますが、アセンブリのリベースは、メモリ使用量の削減に関して実際に効果があります。私は彼が言及しているWinDbg+SoSツールを掘り下げる必要があります。これは私がしばらくの間リストに載せていたものですが、今ではもう延期できないと思います:)
編集:私が主題に関して見つけたいくつかのリンク: