[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>
posted on 2012-03-19 11:18  victor321  阅读(255)  评论(0)    收藏  举报