[DllImport("kernel32.dll")]
public static extern bool SetProcessWorkingSetSize(IntPtr proc, int min, int max);
public void FlushMemory() {
GC.Collect();
GC.WaitForPendingFinalizers();
if (Environment.OSVersion.Platform == PlatformID.Win32NT) {
SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
}
}
调用:SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
MSDN对这个函数的解释:
使用这个函数来设置应用程序最小和最大的运行空间,只会保留需要的内存。当应用程序被闲置或系统内存太低时,操作系统会自动调用这个机制来设置应用程序的内存。应用程序也可以使用 VirtualLock 来锁住一定范围的内存不被系统释放。
当你加大运行空间给应用程序,你能够得到的物理内存取决于系统,这会造成其他应用程序降低性能或系统总体降低性能,这也可能导致请求物理内存的操作失败,例如:建立 进程,线程,内核池,就必须小心的使用该函数。
实际上,这个函数并不能真正的释放内存,而只是重新分配改程序的内存占用,将暂时不需要的内容放进虚拟内存,当应用程序重新激活时,会将虚拟内存的内容重新加载到内存。所以,我们不宜过度频繁的调用该方法,这样只会使性能变低。
实际使用中,我们只需要当窗口关闭时,或者最小化时调用此方法即可解决内存不能释放的问题,该方法同样适用于Silverlight和Winform。
对于Silverlight的内存释放,我们可以使用一个Js的setInterval方法每间隔一段时间去自动释放内存,该方法原理为将浏览器最小化后再找回焦点,我们肉眼看到仅是页面闪了一下,再无任何其他感觉。就这么一瞬间,就算Silverlight应用程序导致浏览器占用了数百M的内存,照样完全释放无误。这是该例子Demo,有兴趣的朋友可以下载体验一下。
<script type="text/javascript">
function intervalFlushMemory() {
setInterval(FlushMemory, 60000);
}
function FlushMemory() {
min.Click();
window.focus();
}
</script>
<body onload="intervalFlushMemory();">
……
<object id="min"
type="data:application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11">
<param name="Command" value="Minimize" />
</object>
<button onclick="FlushMemory();">释放内存</button>
……
</body>
浙公网安备 33010602011771号