2009-06-21 31 views
3

私は複数回実行するアプリケーション(winform exe)を持っています。これは、アセンブリを共有していることを意味しますか、または各インスタンスにアセンブリのコピーがありますか?私は、アプリケーションを実行すると、約30メガバイト(タスクマネージャーで)を使用し、私は別の30MBを使用するアプリの別のコピーを実行するとき。共有メモリと実行可能ファイルの複数のコピーを実行する

どのくらいのメモリを使用しているか、いくつかのインスタンスを実行するとメモリの過剰使用を減らすことができますか?

よろしくお願いいたします。 JD。

+0

静的または動的にリンクされていますか? –

答えて

4

複雑です。

私の最近の仮想メモリに関する記事を読むことから始めます。

http://blogs.msdn.com/ericlippert/archive/2009/06/08/out-of-memory-does-not-refer-to-physical-memory.aspx

OK、今あなたは仮想メモリがどのように動作するかをある程度理解を持っていることを、あなたは、オペレーティングシステムがメモリにDLLをロードする方法を理解することができます。 Foo.DLLの特定のページが必要な2つのプロセスがあるとします。オペレーティングシステムは、そのページを物理のメモリにロードし、その物理ページを両方のプロセスの仮想空間にマップします。したがって、使用されている物理メモリの量は、例えば、4KBのページです。しかし、その4KBは両方のプロセスに現れます。 30MBのほとんどが物理メモリを共有している可能性があります。

あなたのタスクマネージャの使用について、より洗練された方法を見つけることができます。そこにいくつかの列を追加して、 "Working Set"と "Private Working Set"の両方を見たいとします。 「ワーキングセット」は、そのプロセスによって現在使用されている非公開かつ共有されているページの総数です。 「プライベートワーキングセット」は、共有されていないものの数です。

メモリの使用量を減らすには - まず、気になる理由を理解してください。今日のマシンはたくさんのメモリを持ち、30MBは比較的小さなメモリです。あなたがこれに取り組むための魅力的な顧客中心の理由を見つけ出すことができない限り、あなたのプログラムをより速くするか、より多くの機能を追加するなど、何か他のものに取り組んでください。あなたが気にする理由があると仮定して、自分自身にいくつかのツール、特にメモリプロファイラを手に入れましょう。 .NETメモリプロファイラは、すべての割り当てがどこにあるのか、どれくらいの大きさであるのかを示すことができます。

0

アプリケーションの2番目のコピーを実行すると、別の30MBのメモリが使用されていることに気づいたときは、自分の質問に答えたと思います。

アプリケーションの各インスタンスは独自のプロセス空間で実行され、アプリケーションの他のインスタンスとメモリまたは非ファイルリソースを共有しません。

あなたのアプリケーションが何をしているのかわからなくても、私が(今のところ)使用するメモリの量を減らす唯一の方法は、ディスクにデータを書き込むことです。これらのオブジェクトが範囲外になったときにメモリが解放されますが、ディスクからデータを読み戻すと明らかに再利用されます。

+0

クイック返信クリスありがとう。 使用されているアセンブリをGACに登録するとどうなりますか?助けてくれますか? –

+0

私はそうは思わない - しかし、私は本当にGACを掘り下げなかったので、私は確かに言うことができない。 – ChrisF

+0

いいえ、プロセスのメモリにロードする必要があります。また、現在WinFormsアプリケーションで使用しているアセンブリのほとんどは、すでにGACに入っています。 – weiqure

1

静的リソースがない場合は、2番目のプロセスを使用する代わりに、アプリケーションが起動され、そのインスタンスが既に存在するときに新しいスレッドを追加します。これがFirefoxの役割です。

+0

それは良い考えです。余分なメモリ使用量がありますが、アプリケーションの完全なコピーよりも少なくなります。 – ChrisF

関連する問題