表单关闭时释放内存
本文关键字:释放 内存 表单 | 更新日期: 2023-09-27 18:01:13
我搜索了很多关于表单关闭时释放内存的信息,但我没有找到任何释放表单使用的内存的解决方案。stackoverflow或其他论坛中的大多数答案都是表单。Dispose((或GC.Collect((对释放内存没有帮助。
但我发现一篇文章使用C#在Windows窗体应用程序中释放内存(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"方法吗?/它是如何工作的?/这种方式有利于释放内存吗?这会导致任何问题还是会使应用程序速度变慢?
您应该只释放外部非托管资源(关闭打开的连接、文件处理程序等(,并使用该资源实现的Dispose
方法来执行此操作。
无需尝试强制GC释放与窗体相关的托管对象。在99%的情况下根本不调用GC。
无需使用外部Windows API方法,它不是.NET方式。阅读MSDN上的内存管理工作原理。
您应该找到为什么您的托管对象没有被释放。
至于WinForms:大多数问题可能是由左事件处理程序引起的。查看Winforms应用程序中已回答的"内存泄漏"问题的更多详细信息。使用任何内存档案器(例如ANTS(来查找阻止Forms对象释放的引用。
Hans Passant在另一个问题中已经指出
SetProcessWorkingSetSize()
控制进程使用的RAM数量。CCD_ 3通常用于增加为进程分配的RAM的数量。
1:-它是如何工作的?
答:-假设我的应用程序中有许多表单或对话框,我要在我关闭每个表单后调用
SetProcessWorkingSetSize()
,或者对话框,以便操作系统释放资源。
2:-这种方式有利于释放内存吗?
答:-我认为没有。Windows已经非常擅长动态控制这一点,当另一个进程需要RAM。手动执行此操作会降低程序的速度很多,当Windows被迫交换内存页面返回。
3:-这会导致任何问题,还是会使应用程序速度变慢?
答:答案2中提到了"是"。