2011-12-09 83 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); 

它運作良好釋放工作集的大小。 好吧,一些屏幕必須開放商業邏輯,所以內存大小仍在增長,最終死了應用程序。

但是我無法減少或釋放已經增長的虛擬內存大小。

我想配置的app.config

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

這是行不通的。 對此有任何影響。

我試圖用VMMap 3.1查看。 圖像主要是.net ngen圖像。 程序集和其他引用dll的部分不是那麼大。 當然一些dll(winform的第三個pary控件)大約5〜6MB。

如何在我的應用程序中減少虛擬內存(提交)大小?

請儘快讓我知道更好的方法。 像這樣

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

謝謝。

+0

沒有魔杖,你必須編寫更聰明的代碼。減少工作集的大小是毫無意義的。 –

回答

1

你需要找出是什麼導致你的記憶成長。 .Net Memory Profiler是一個很好的工具,因爲你可以在一段時間內拍攝快照並將它們相互比較。您將能夠看到哪些對象「泄漏」,並且它將爲您分配&這些對象的根堆棧,以便您可以修復代碼以釋放引用。

在附註中,您的app.config文件中的DisableDoubleMapping在.Net 4中毫無用處。它被添加爲.Net Framework 3.5中導致程序集加載到內存中的錯誤的解決方法。你可以在Microsoft's hotfix page for KB981266中閱讀更多關於它的內容。