2011-12-09 12 views
1

私のアプリは.NET 4.0とWinFormを実行しています。私のアプリで仮想メモリ(コミット)サイズを減らすにはどうすればいいですか?

Mdiアプリケーションとサードパーティコントロールが使用されています。

実行中は、仮想メモリ(コミット)サイズはまだ増えています。 私はこのような行

GC.Collect(GC.MaxGeneration); 
GC.WaitForPendingFinalizers(); 
SetProcessWorkingSetSize(p.Handle, -1, -1); 

[DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)] 
public static extern int SetProcessWorkingSetSize(IntPtr process, int minimumWorkingSetSize, int maximumWorkingSetSize); 

としてそれがうまく機能しているとのworkingSetサイズを小さくしてリリースすることができます。 さて、ビジネスロジックのためにいくつかの画面を開いておく必要があります。そのため、メモリサイズはまだ成長しており、最終的にはアプリケーションを使い果たしてしまいました。

しかし、仮想メモリのサイズを縮小したり解放したりすることはできませんでした。

私はそれが動作していないのapp.config

<runtime> 
<DisableDoubleMapping enabled="true" /> 
<gcTrimCommitOnLowMemory enabled="true"/> 
</runtime> 

構成に試みました。 それに及ぼす影響。

VMMap 3.1で表示しようとしました。 イメージはほとんどが.net ngenイメージです。 アセンブリの一部と追加の参照dllはそれほど大きくありません。 もちろん、dllのいくつか(winformのための第3のparyコントロール)は約5〜6MBです。

私のアプリで仮想メモリ(コミット)サイズを減らすにはどうすればよいですか?

できるだけ早く私に教えてください。

SetProcessWorkingSetSize(p.Handle, -1, -1); 

このように感謝します。

+0

魔法の杖はありません。よりスマートなコードを書く必要があります。ワーキングセットのサイズを減らすことは無意味です。 –

答えて

1

あなたの記憶が最初に成長する原因を突き止める必要があります。 .Net Memory Profilerは、時間の経過とともにスナップショットを取得し、それらを互いに比較することができるので、これのための良いツールです。どんなオブジェクトが「漏れているか」を見ることができますし、それらのオブジェクトのための割り当ての&ルートスタックを与えるので、コードを修正して参照を解放することができます。

app.configファイルのDisableDoubleMappingは.Net 4.では無効です。.Net Framework 3.5のバグの回避策として追加され、アセンブリがメモリに2回ロードされました。 Microsoft's hotfix page for KB981266で詳細を読むことができます。