方法一:
GC.Collect();
GC.WaitForPendingFinalizers();
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
{
SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
}
[DllImport("kernel32.dll")]
private static extern bool SetProcessWorkingSetSize(IntPtr proc, int min, int max);
通过通知系统最大最小化来触发内存释放,不过该方法也只是将部分内存移至虚拟内存中。
方法二:
Nuget 中 Lierda.WPFHelper,再AppStratup时,new一下,然后内存基本可以压缩到50MB以内,这个DLL每30s压缩一次内存,最低可以压缩到10MB。
/// <summary>
/// App.xaml 的交互逻辑
/// </summary>
public partial class App : Application
{
LierdaCracker cracker = new LierdaCracker();
protected override void OnStartup(StartupEventArgs e)
{
cracker.Cracker(100);//垃圾回收间隔时间
base.OnStartup(e);
}
}
PS:通过反编译得知,该方法的原理也是方法一。
总之不是真的释放内存,但是只是为了一个立竿见影的效果,可以临时用一下。
本身会更加损耗硬盘。同时如果程序有内存泄露的问题,也依然会出现内存溢出的情况。
这里有大神总结的结论,我就不重复粘贴了:https://www.cnblogs.com/kex1n/p/4043901.html