4

私たちのアプリケーションには多くの .NET アセンブリがあり、これまで NGen スクリプトを使用してデプロイされていなかったため、実行時に常に JIT されます。

私たちのアプリケーションは通常、ターミナル サーバーに展開されるため、Windows でコードのバイナリ イメージを共有することがおそらく現在の方法よりも最適であるため、ベース アドレスの設定とアセンブリの NGen 化を検討しています。

そこで、NGen をまったく使用せずにプログラムを実行し、[SysInternals の listdlls][1] を使用してそれぞれのサイズを見つけ、それを次のクラスのサイズ (つまり、xxxx --> 10000) に増やしました。次に、すべてのアセンブリのメモリ リストをレイアウトし、それらすべてのベース アドレスを調整しました。

これまでのところlistdlls、実行時にアセンブリがリベースされていないことがわかりました。

しかし、2 つのインスタンス間で実際に共有されているメモリの量を測定するにはどうすればよいでしょうか? 基本的に、アセンブリで NGEN を実行せずにプログラムの 2 つのインスタンスを開始し、NGEN を実行した後にもう一度実行するとします。

実際の効果を見つけるには、どのような数値をどのツールから見ればよいでしょうか?

たとえば、アセンブリをリベースする行為自体が、使用しているサード パーティのアセンブリ (たとえば、DevExpress コンポーネント) を移動させて、突然リベースしなければならなくなり、すべてがウォッシュになるという事実を認識しています。

では、どこからどの数字を読むのでしょうか? 同様に、タスク マネージャーのワーキング セットを使用しますか? プライベートメモリー?コミットサイズ?前後にメモリを解放しますか?

何かアドバイス?

4

2 に答える 2

2

唯一の意味のある値は、プロセス間で共有できない割り当てられたバイト数(場所に関係なく)であるプロセスのプライベートバイトです。

ソースが見つかりませんが、現在の.Netは、(一部の)アセンブリを共有することもできます。

編集:私はまた、ngeningの有無にかかわらずプライベートバイトの変更についてのあなたの発見に興味があります。

于 2010-04-22T13:49:04.743 に答える
1

実際、Vista 以降ではリベースする必要がなくなりました。この Microsoft ブログを参照する別の投稿に対する私の回答を参照してください。ブログでは、「ASLR では、最終的な場所はマシンごとにランダムですが、マシン上の各プロセスでは同じです。つまり、再配置されたデータをすべてのプロセスで共有できます」と説明しています。

リベースのプロセス全体は少しばかげているので、これは歓迎すべきニュースです!

于 2012-04-11T02:38:38.557 に答える