ASP.NET内存疯狂占用,我差点崩溃了,幸好还是解决了。

  原来写过的一部分ASP.NET的页面用于数据的选择,也就是把符合条件的记录都显示出来,由用户选择其中的一条。为了加快速度,所有符合条件的数据取出后放在了Session中,分页查找时直接取这个数据就可以了。一直运行的很正常(呵呵,可能是也不正常,只不过没有看出来),后来换了一个数据量比较大的系统,选择几次数据后内存占用竟然到了1个多G,最终造成内存超过极限进程崩掉了。
  百思不得其解,数据是保存在Session中的,退出的时候也根据相关的Key值清除了,应该会释放掉了。但是即使我加了强制回收垃圾代码也不管用。
  没办法,读代码吧,反正知道是在哪部分出的问题。发现产生了一个新的Table用于分页,然后这个Table绑定了自定义的DataGrid并且也放到了Session中,这部分是DataGrid管理的,退出时没有清除。但是这个Table中仅有10行数据(默认的),并且同一个用户打开同一个选择会冲掉以前的缓存,所以不应该出现这么大的内存占用啊。
  只好在缓存的数据做文章了。缓存的是一个DataView(实际是一个DataTable的DefaultView),来点狠的,退出页面时调用CacheData.Table.Clear()清除掉DataTable中的数据然后CacheData.Dispose(),再用原来的处理清除其他Session中缓存的数据(几个标志,成不了什么气候),顺手在DataGrid中增加方法清除掉缓存,然后强制回收垃圾,运行、测试,查看内存,哈哈,一直稳定在40~50M之间啊。
  俺的机器不行,太大的数据查询造成连接超时,换到了服务器上的正式系统中,打开多个IE访问、测试,基本稳定在了300M左右。成功!
  有必要的话,太大的对象不使用了最好还是显示清除一下好。因为这部分代码写的比较早,想到.NET应该可以自动回收,所以当时根本没有在意这个问题。 想想写这些代码的时候还是比较弱啊 :D
posted @ 2005-07-30 08:57  海阔天空  阅读(8404)  评论(29编辑  收藏  举报