方法一:
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