ターミナル サービス環境で .NET 2.0 WinForms アプリを実行すると、説明のつかない予期しない結果が発生します。私が読んだすべてのことは、JIT されたアセンブリ (つまり、NGen を使用してネイティブ イメージを作成しない) により、すべてのコード スペースがプライベート ページに格納され、ワーキング セットのサイズ/メモリ プレッシャーが増加することを示しています。ただし、実際の結果 (Process Explorer、VMMap、および WinDbg を使用して検証) は、JIT されたアセンブリでさえ実際に共有可能なページに配置されていることを示しています (また、アプリの複数のインスタンスが実行されている場合、別の TS の下であっても実際に共有されています)。セッション/ユーザー)。
これがなぜなのか、誰か説明できますか?これは W2K8 サーバー環境で実行されているため、ASLR は、各アセンブリの特定のベース アドレスの欠如とその結果のリベースが問題を引き起こしていない理由を説明しています。それでも、これらがネイティブの PE イメージではないという事実は、これらのアセンブリのコードがプライベート ページに格納されるという結果になるはずです。
これは、メモリ負荷を軽減するために NGen を使用して調査を開始したときに発見されましたが、JIT されたアセンブリが既に共有されていたため、実際にはワーキング セットのサイズが増加していることがわかりました。
私が見つけた最新のリファレンスはここにありますが、これも実際の調査結果とは異なります。
編集:最初に質問を投稿して以来、Windows Server 2003 テスト ボックスでのさらなる実験でも、明らかに JIT されたアセンブリがプロセス間で共有可能であることを示していることを追加する必要があります。私が見つけることができるすべてのアドバイスがNGenが必要であることを示している理由について、私はまだ困惑していますが、現実世界のすべての証拠はそれと矛盾しています. ここの専門家が光を当てることができることを本当に望んでいます。
ありがとう!
編集:私はすべての .NET/CLR の本を払い落としましたが、これを解決するための検索クエリのアイデアが不足しています。「何が起こっているのかわからない」というひどいしつこい気持ちを解消して、私の一日を充実させてくれるのは誰!?! :)