我是靠谱客的博主 要减肥刺猬,最近开发中收集的这篇文章主要介绍.NET中通过垃圾收集器(GC)对资源进行主动释放示例,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

     自编了一个小的应用程序,目的是为了将一些列Xml文件还原到数据库中,其中为了保证Xml文件内容的完整和规范性,添加了一步Schema检测的过程,然后通过读取Xml文件,并再其中获取相应的节点,并拼组相应的Sql执行语句,最终将数据保存到数据库中,起初一些测试皆比较顺利,再顺利排除了一些小bug后,本已经觉得没有什么太大问题会出现,不料事出有因,同时处理6000多份Xml数据的时候,其中有一份Xml不能正确还原的原因居然是“OutOfMemory”,随后,单独对该Xml文件进行处理,没有发生问题,随后,又接连发生多份相同原因的错误,很是诡异。
    初步调查,发生问题的文件一般较大,一般都在60M以上,又发现,只有当多个大文件一同进行处理的时候,方有几率发生问题!
    我用的是windows 2008系统,硬件内存2G,虚拟内存1.5-3G,经过观察,发现任务管理器中只显示2G物理内存,当内存使用值逼近2G时,就发生操作错误,后逐步跟踪,发现几处操作占用内存较大,其中一处占用内存近乎Xml文件的10倍之大,该操作竟然是Schema校验,很意外,其他地方,包括读取Xml文件到内存变量和将大数据量文件插入数据库等操作均占用大量内存,通常在Xml文件3倍范围之内,还处于接受范围之内,就未修改前的情况,操作中,内存的峰值将有可能到达Xml文件的15倍!加上Sql数据库占用内存被设置为512M,所以,处理60M文件时,出现的峰值内存使用量将达2.3G左右,不理解为何虚拟内存不能充当其用,难道是widnows 2008的特性?
    看了一些资料,又仔细了解了下.Net的GC(垃圾收集器)原理,于是决定尝试下手动收集,因为该部分资源并非非托管资源,所以,就直接使用GC提供的收集功能,效果还不错,其中要说的一点是,继承IDispose,然后定义一个Dispose()方法,其中调用GC.collect()方法,即可,但不能在静态类中使用,且最好在实例化和使用完对象后进行资源整理,效果一般会更好些,通过上述方法,Schema校验后直接调用垃圾收集器,可100%收集掉突增的巨量内存占用量,后面两步操作也同样可以收集掉75%以上的占用量,完全去除了高峰值的危险!
    就官方版本的说明,虽然.NET垃圾收集器已经更新了3个版本,但是,仍旧有其使用的限制性,当我们遇到一些比较特殊的使用环境的时候,如果自动垃圾收集不能满足我们的性能需要的时候,打开MSDN查查GC类的成员函数,或许能够找到比较满意的处理方式也不一定哦。

最后

以上就是要减肥刺猬为你收集整理的.NET中通过垃圾收集器(GC)对资源进行主动释放示例的全部内容,希望文章能够帮你解决.NET中通过垃圾收集器(GC)对资源进行主动释放示例所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部