C# 窗体关闭时释放内存
我搜索了很多关于表单关闭时释放内存的信息, 但我没有找到任何释放表单使用的内存的解决方案。 stackoverflow或其他论坛中的大多数答案是form.Dispose()或GC.Collect()无助于释放内存 但是我发现了一篇文章() 幸运的是,文章中的代码运行良好:) 我的问题是,是否有人熟悉“SetProcessWorkingSetSize”方法它是如何工作的?/这种方式有利于释放内存吗?这会导致任何问题还是会使应用程序运行缓慢?如中所述C# 窗体关闭时释放内存,c#,.net,winforms,memory-management,windows-applications,C#,.net,Winforms,Memory Management,Windows Applications,我搜索了很多关于表单关闭时释放内存的信息, 但我没有找到任何释放表单使用的内存的解决方案。 stackoverflow或其他论坛中的大多数答案是form.Dispose()或GC.Collect()无助于释放内存 但是我发现了一篇文章() 幸运的是,文章中的代码运行良好:) 我的问题是,是否有人熟悉“SetProcessWorkingSetSize”方法它是如何工作的?/这种方式有利于释放内存吗?这会导致任何问题还是会使应用程序运行缓慢?如中所述 SetProcessWorkingSetSize
SetProcessWorkingSetSize()
控制进程使用的RAM量SetProcessWorkingSetSize
通常用于增加为进程分配的RAM量
1:-它是如何工作的
答:假设我的应用程序中有许多表单或对话框,我
要在关闭每个窗体后调用SetProcessWorkingSetSize()
,或
对话框,以便操作系统释放资源
2:-这种方式有利于释放内存吗
答:我想没有。Windows已经非常擅长动态操作了
控制这一点,当另一个需要时,根据需要交换内存页
进程需要RAM。通过手动执行此操作,可以降低程序的速度
很多,当Windows被迫交换页面时,会导致很多页面错误
内存页返回
3:-这是否会导致任何问题,或者这会使应用程序变慢
答:回答2中提到的是
您应该只释放外部非托管资源(关闭打开的连接、文件处理程序等),并使用由该资源实现的
Dispose
方法来执行此操作
无需尝试强制GC释放与表单相关的托管对象。在99%的情况下,根本不调用GC
不需要使用外部Windows API方法,这不是.NET方式。阅读内存管理是如何工作的
您应该找到未处置托管对象的原因
至于WinForms:大多数问题可能是由左事件处理程序引起的。检查已回答问题的更多详细信息。使用任何内存探查器(例如ANTS)来查找阻止窗体对象释放的引用。为什么要这样做?建议不要这样做,垃圾收集器会帮你这样做。这是.NET-将内存管理留给垃圾收集器。有一些最佳实践,比如在IDisposable上调用Dispose(),但不确定您在这里想要实现什么?@poke,您的问题的答案是我的问题。表单关闭后,分配给该表单的内存不会释放。所以我试着用那个代码释放内存,但这并不能回答为什么你想手动释放内存。你为什么一开始就关心它?
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);
}
}
}