代码改变世界

WSS中的SPSite和SPWeb为什么需要释放内存,如何快速发现代码中的未释放内存

2009-11-06 09:37  Virus-BeautyCode  阅读(2192)  评论(4编辑  收藏  举报

   

  本内容为翻译微软的官方文档和一些国外的blog的内容,详细这些内容的原文可以参看

  

  http://www.cnblogs.com/virusswb/archive/2009/11/05/1596495.html

   

  为什么需要释放内存

  在众多的sharepoint对象中模型中,主要是SPSite类和SPWeb类的对象,虽然是使用托管代码创建。但是,这些对象主要使用非托管的代码和内存进行工作。对象中的托管部分相比较非托管部分来说,所占比例非常小。因为占比较小的托管部分不给垃圾回收期任何压力,垃圾回收器不会定时回收管理这些对象使用的内存。使用大量非托管内存的对象,可能会引起一些异常的行为。例如:

  1)WSS的应用程序池频繁回收,尤其是在使用的高峰期

  2)应用崩溃

  3)IIS占用大量内存

  4)系统和应用性能差

  在WWS中调用实现IDisposable接口的对象,一定要在这些对象使用完毕之后释放他们。你不应该依赖于垃圾回收器自动释放他们所占用的内存。

 

  因为在SPSite和SPWeb的内部会调用internal class Microsoft.SharePoint.Library.SPRequest,这个对象使用非托管的Com资源,所以你可以通过一种简单的方式来发现你的代码中是否有没有释放的内存。

  打开C:\Program Files\Common Files\microsoft shared\Web Server Extensions\12\LOGS\目录中的日志文件,F3查询SPRequest或者是dispose,仔细看看是否有AN SPRequest object was not disposed before the end of this thread之类的描述,应该就是没有释放的问题。

  应用程序池的内存消耗峰值的设置应该根据应用的运行状况进行调整,当你的应用性能下降的时候,你应该观察C:\Program Files\Common Files\microsoft shared\Web Server Extensions\12\LOGS\目录中的日志文件,看看到底创建了多少SPRequest对象,是否创建了过多的SPRequest对象。即使没有正确的释放内存还没有影响你的应用性能,你也应该重新设计你的站点和代码,以减少过量创建SPRequest导致的内存消耗问题。