我搜索了很多关于表单关闭时释放内存的信息, 但我没有找到释放表单使用的内存的任何解决方案。 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”? / 这个怎么运作? /这种方式对释放记忆有好处吗?这会导致任何问题,否则会导致应用程序变慢?
答案 0 :(得分:1)
SetProcessWorkingSetSize()
控制您的进程使用的RAM量。 SetProcessWorkingSetSize
通常用于增加为进程分配的RAM量。
1: - 它如何运作?
Ans: - 假设我的应用程序中有很多表单或对话框,我 我想在关闭每张表格后致电
SetProcessWorkingSetSize()
对话框,以便操作系统释放资源。
2: - 这种方式有利于释放记忆吗?
答:我认为,Windows已经非常擅长动态 控制它,在另一个时按需交换内存页 进程需要RAM。通过手动执行此操作,可以减慢程序速度 很多,当Windows被迫交换时导致很多页面错误 记忆页面重新进入。
3: - 这会导致任何问题,否则会导致应用程序变慢?
答案: - 答案2中提到了。
答案 1 :(得分:1)
您应该只释放外部非托管资源(关闭打开的连接,文件处理程序等),并使用该资源实现的Dispose
方法执行此操作。
无需尝试强制GC释放与Forms相关的托管对象。在99%的情况下,根本不打电话给GC。
无需使用外部Windows API方法,它不是 .NET方式。阅读内存管理在MSDN上的工作原理。
您应该找到为什么您的托管对象未被处置。
对于WinForms:大多数问题可能是由左侧事件处理程序引起的。查看已回答问题Memory Leaks in Winforms application的更多详细信息。使用任何Memory Profiler(例如ANTS)以查找阻止Forms对象释放的引用。