2010-12-20 11 views
0

私は大量のメモリ消費量を持っています。通常、GCはメモリのクリーニングをうまく処理します。 しかし、アプリケーションが2つの異なるマシンにインストールされている場合があります.1つは2GBのメモリ、もう1つは3GBのメモリです。 3GBのメモリではOut of Memory例外でクラッシュし、2GBではneversに失敗します。 .netランタイムは両方のマシンで同じで、アプリケーションのインストールも同じです。 メモリがいっぱいになると、Grabage Collectorを起動するトリガーが時間通りに起動されない可能性がありますか?異なるマシンでのガベージコレクタのパフォーマンス

+0

2台のマシンでは、RAMサイズよりもはるかに多くのサイズが必要です。私たちにはオペレーティングシステムが必要であり、あなたがしていることとそうでないことをよく理解している必要があります。あなたはビットマップのような多くの管理されていないリソースを扱いますか? ORMを使用していますか?メモリのGCピニングを使用していますか? – Aliostad

答えて

0

収集するものがある場合、GCが機能することがわかります。コードでオブジェクトがGCによって無視される原因となっている未知のメモリリークがあるように聞こえます。言い換えれば、ランタイムに応じてコレクションに実行可能ではありません。

多くのイベントを使用していますか?

あなたはGCが有効なオブジェクトを収集していないと思われる場合は、あなたがコレクションを強制することができます(ポスト先制防衛:GC.Collectを呼び出すことはめったに必要ないとされたメモリプロファイリングツールのない代替):

GC.Collect(GC.MaxGeneration)

http://msdn.microsoft.com/en-us/library/y46kxc5e.aspx

オブジェクトを収集する準備ができている場合、ここで収集されます。オブジェクトへの参照が保持されていると思われ、GCを停止します。

更新:もちろんボックス外では、メモリが不足しているマシンは必ずしもプログラムのためではありません。この他のコンピュータは、2Gbコンピュータとは対照的に、もっと多くのデータを同時に処理しますか?

+0

仮想-1。マシンがメモリ不足になると、 'GC.Collect'を呼び出すことは明らかにGCのしきい値を超えているので何も証明しません。 – Aliostad

+0

マシンがその状態になる前に、GC.Collectを呼び出して作業セットを減らすことができます。それは、GCが* OPで取り除かれたように、*失敗するものではない可能性が高い*と思われる隠れた議論でした。 –

+0

3GBのマシンでは、結果的に実行するものはそれ以上ありません。コレクションの実行のトリガーが呼び出されていないようです。 – Ariel

3

RAMの量は、はありません。は、.NETプログラムで使用できるメモリの量に関係します。最新のオペレーティングシステムはすべて仮想メモリを提供します。 Windowsでは、プログラムで使用可能な仮想メモリの一般的な量は2ギガバイト未満です。特別なブートオプション(/ 3GB)があり、オペレーティングシステムからアドレス可能なメモリを奪うという代償を払って3GBまで増やすことができます。現代のほとんどのマシンでは動作しません。ビデオカードは、あまりにも多くのアドレス指定可能な物理メモリを食いつぶす傾向があります。このため実際には2GB未満にすることは不可能ではありません。

マシンが64ビットオペレーティングシステムを実行している場合、コードがx86モードで動作する場合、4ギガバイトに近づきます。また、x64モードの仮想メモリの大部分は、ページングファイルの最大サイズによってのみ制限されます。

これらの仮想メモリサイズは、マシンにインストールされている実際のRAM容量とは完全に独立しています。 15年前の非常に一般的な仮想メモリ空​​間よりもRAMが少ない場合は、いわゆる「ページングファイルのスラッシング」を呼び出すことができます。あなたは、オペレーティングシステムが、あまりにも多くの仮想メモリを同時に使用する必要性を尊重するのに十分なRAMを提供しようとしているのを見ています。 RAMとページングファイルの間でデータを交換します。それはマシンをひどく遅くすることがあります。

OutOfMemoryExceptionは、プログラムがアドレス指定可能な仮想メモリを使い果たしたことを示しています。最も典型的な原因は、実際にはすべてのアドレス空間を完全になくすわけではありません。割り当てようとしているオブジェクトに合わせて十分な大きさの穴がありません。仮想メモリは断片化する可能性があります。 SysInteralsのVMMapユーティリティを使用すると、プログラムの仮想メモリがどのように分割されているかを把握できます。

仮想メモリが不足しているのは処理が非常に難しく、本質的には回復できない非同期例外です。ビットマップの読み込みのようなものを除いて、たくさんの(管理されていない)メモリを必要とするオブジェクトの種類は、したがって、ほとんどの場合、十分な大きさの穴を見つけることにほとんど問題がありません。一般に、あなたのプログラムは、利用可能な領域の半分を使用するよりも、決して近くになるべきではありません。それは通常困難ではない、ギガバイトは多くの記憶です。プログラムのニーズが基本的にその限界を超えている場合は、プログラムに64ビットのオペレーティングシステム要件を指定する必要があります。 200ドルの解決策。

関連する問題