2015-07-06 60 views
0

我在表格關閉時搜索了很多關於釋放內存的東西, 但我沒有找到任何解決方法來釋放表單使用的內存。 大多數在stackoverflow或其他論壇的答案是form.Dispose()或GC.Collect()將無助於釋放內存。當表格關閉時釋放內存

但是我發現了一篇文章Release memory in Windows Form application using C#http://codesmithdotnet.blogspot.com/2008/02/release-memory-in-windows-form.html

好在從文章做工精細:)

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

    public static void FlushMemory() 
    { 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 
     if (Environment.OSVersion.Platform == PlatformID.Win32NT) 
     { 
      SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1); 
     } 
    } 
} 

我的問題是代碼,是任何人都熟悉有關法 「SetProcessWorkingSetSize」?/怎麼運行的? /這種方式有利於釋放內存嗎?這是否會導致任何問題,或這會使應用程序變慢?

+2

你爲什麼要這樣做? – poke

+1

建議沒有這樣做,垃圾收集器會爲你做。 –

+0

這是.NET - 將內存管理留給垃圾收集器。有一些最佳實踐,比如在IDisposable上調用Dispose(),但不確定你想在這裏實現什麼? – Kevin

回答

1

正如已經Hans Passantanother question

SetProcessWorkingSetSize()控制你的程序使用的RAM數量指出。 SetProcessWorkingSetSize通常用於增加爲進程分配的RAM數量。

1: - 它是如何工作的?

答: - 假設我有我的應用程序多種形式或對話框,我 想打電話SetProcessWorkingSetSize()後,我關閉每個窗體或 對話框,讓OS釋放的資源。

2: - 這種方式對釋放內存有好處嗎?

答: - 我想號的Windows已經是相當不錯的動態 控制這一點,就要求換內存頁出當另一個 進程需要RAM。通過手動這樣做,你放慢你的程序 很多,造成大量的頁面錯誤當Windows被迫調換 內存頁回到

3:-Is這將導致任何問題或本會使應用程序變慢?

答:在回答中提到 - 是2

1

您應該僅釋放外部非託管資源(關閉打開的連接,文件處理等),做到這一點使用方法Dispose通過實施資源。

不需要嘗試強制GC發佈與窗體相關的管理對象。 99%的病例根本不打電話給GC。

無需使用外部Windows API方法,它不是.NET方式。瞭解內存管理如何在MSDN上運行。

您應該找到爲什麼您的託管對象不會丟棄。

至於WinForms:大多數問題可能是由左側事件處理程序引起的。查看已回答問題Memory Leaks in Winforms application的更多詳細信息。使用任何內存分析器(例如ANTS)來查找引用,以防止表單對象釋放。