2015-07-06 59 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)来查找引用,以防止表单对象释放。