前段时间做一个C#的项目,其中一个需求是这样的:首先向一个MDB文件中写入一些数据,然后对MDB文件进行压缩,最后将MDB文件删除。在第一次完成后进行测试,发现偶尔的情况下,MDB文件没有被删除,跟踪调试下,发现程序抛出一个”其他进程正在使用该资源“的异常,导致文件不可删除。
    改正这个bug 的过程是一个痛苦的过程,首先向MDB文件中写数据时,用一个OleDBConnection打开对MDB文件的连接,然后利用DataAdapter进行数据增删改的操作,最后关闭连接。整个过程是很清晰的,这样导致问题的出现非常诡异,原因基本知道,是因为数据库持有的一些资源没有被及时释放。解决这个问题分成了两个阶段,第一个阶段,把对MDB文件的操作由共享方式改为独占方式,然后分步排查是否有连接最后没有被关闭,结果发现一个,关闭后试了几次,都很正常,于是交给客户了,结果,没过几天客户反映还是不能删除,于是进入第二个痛苦的阶段,由于已经确认所有的连接都已经关闭,这样导致很难找到其他原因,后来经过思考和查找,感觉问题出在.NET的垃圾回收机制上。
    由于之前没有出现过类似的问题,所以没有关注过垃圾回收,.NET的垃圾回收机制采取的是引用计数的方式,当在堆中的一个对象A,它的引用计数为0,也就是说在栈中没有任何一个变量指向它,这时对象A就被标记为可回收,但是不是立刻被释放。所以.NET的垃圾回收机制不是实时回收的,只有在内存不够的情况下,回收机制才会去释放那些被标记为可回收的对象。
    这样之前的问题就可以有一个合理的解释了:虽然最后MDB的连接都关闭了,但是连接所持有的关于MDB文件的相关资源并没有被及时释放,在这种情况下,删除MDB文件自然就会出现问题。
    问题最终得到了解决,解决的方法是在对MDB文件增删改的方法后,调用GC.Collect();方法,这样可以通知垃圾回收机制,马上进行一次垃圾回收。但是网上很多牛人都说基于安全性的考虑最好不要调用这个方法,我现在还不太清楚为什么会导致不安全。如果园子里有大拿知道是为什么的话,可以和我解释一下,先谢了。

.NET的垃圾回收机制引发的问题相关推荐

  1. python 内存回收机制_【第1题】 Pythonn内存管理以及垃圾回收机制

    内存管理 Python解释器由c语言开发完成,py中所有的操作最终都由底层的c语言来实现并完成,所以想要了解底层内存管理需要结合python源码来进行解释. 1. 两个重要的结构体 include/o ...

  2. Java内存结构与垃圾回收机制算法分析

    什么是HotSpot VM 提起HotSpot VM,相信所有Java程序员都知道,它是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机. 但不一定所有人都知道的是, ...

  3. java垃圾回收机制算法分析

    原文参考:蚂蚁课堂余胜军老师. 垃圾回收机制概述 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存 ...

  4. python垃圾回收机制为什么标记能解决循环引用问题_Python 垃圾回收机制和如何解决循环引用...

    引用计数:是一种垃圾收集机制,而且也是一种最直观,最简单的垃圾收集技术, 当一个对象的引用被创建或者复制时,对象的引用计数加 1:当一个对象的引用被销毁时,对象的引用计数减 1:当对象的引用计数减少为 ...

  5. java垃圾回收机制优化_JVM性能优化--Java的垃圾回收机制

    一.Java内存结构 1.Java堆(Java Heap) java堆是java虚拟机所管理的内存中最大的一块,是被所有线程共享的一块内存区域,在虚拟机启动时创建.此内存区域的唯一目的就是存放对象实例 ...

  6. a byte of python中文版_面试官问 Python 版 “垃圾回收”机制,我没答上来

    点击"开发者技术前线",选择"星标?" 13:21 在看|星标|留言,  真爱 选自<萌萌哒的柯基> 作者:heroyfhttps://www.he ...

  7. 垃圾回收机制和JVM垃圾回收常见算法

    垃圾回收机制和JVM垃圾回收常见算法 垃圾回收的好处和特点: 好处: 1. 提高编程效率: 2. 垃圾回收机制保护程序的完整性. 特点: 1. 只能回收无用对象的内存空间,对其他物理资源无能为力: 2 ...

  8. .NET垃圾回收机制 转

    在.NET Framework中,内存中的资源(即所有二进制信息的集合)分为"托管资源"和"非托管资源".托管资源必须接受.NET Framework的CLR( ...

  9. python的回收机制_Python的垃圾回收机制深入分析

    一.概述: Python的GC模块主要运用了"引用计数"(reference counting)来跟踪和回收垃圾.在引用计数的基础上,还可以通过"标记-清除"( ...

  10. python中垃圾回收机制_python 垃圾回收机制

    首先我们要说是 以引用计数为主 标记清楚和分代回收为辅 接下来分以下几个方面解释 一 引用计数 每个对象内部都维护了一个值,该值记录这此对象被引用的次数,如果次数为0,则Python垃圾回收机制会自动 ...

最新文章

  1. win10商店打不开_科技资讯:Win10系统电脑的应用商店老是打不开还闪退怎么办
  2. 监控摄像机 我们要享受飞行的乐趣
  3. FreeBSD 6.0架设管理与应用-附录B 制作FreeBSD安装光盘
  4. ActiveMQ中Topic生产者
  5. 全国计算机等级考试题库二级C操作题100套(第62套)
  6. 【旧文章搬运】360安全卫士HookPort.sys完美逆向
  7. windows下载及安装redis
  8. 学习-Java循环while之求非负数之和
  9. 尼葛洛庞帝,一个反硅谷的创业领袖
  10. 动态规划-背包问题(1)
  11. 当前台式计算机新款,苹果发布全线新款台式Mac机
  12. Anaconda Python 3.7和3.9 GDAL 安装方法, python3安装pyhdf
  13. 160cracked-1
  14. Hadoop在windows下本地调试报错:Exception in thread “main“ java.lang.ExceptionInInitializerError
  15. facebooks项目aria是您一生的Google地图
  16. uni-app入门并使用学习
  17. Python 函数限时运行
  18. /kylin/bin/set-java-home.sh: 第 32 行:[: : 期待整数表达式 kylin/bin/find-hadoop-conf-dir.sh:行33: hbase: 未找到命令
  19. microsoft.ACE.oledb.12.0异常解决(亲测有效)
  20. 1433恢复储存,sql service恢复储存

热门文章

  1. 机器学习,参数之-学习率设置
  2. android studio for android learning (二)
  3. 使用 LaTeX 语言对 MATLAB 中的图片进行标注
  4. matlab绘制两个函数,一系列复杂表达式迭代。怎么能画出某两个变量的函数曲线...
  5. android打开视频噔_Android、iOS不可错过!10款堪称神器的高质量APP,请低调使用...
  6. A guess 解题报告
  7. android ImageView加圆角
  8. 在Android中使用自带API操作Json
  9. 提高开发效率的十五个Visual Studio 2010使用技巧
  10. PHP每天自动更新静态文件下载地址,防盗链