加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

ADO引起的服务器内存泄漏

发布时间:2020-12-12 15:13:12 所属栏目:MsSql教程 来源:网络整理
导读:??? 上个月公司1.8万买了一台dell服务器,于是拿来架设我们的软件做了压力测试,看看到底能负荷多少终端。安装了windows 2008 R2 Enterprise版本64位,数据库用sqlserver 2008 r2。测试发现可以到400台左右,但是发现连续运行两天后,出现out of memory错误
操作系统 ADO版本 是否会内存泄露 windows XP 32bit 2.81.1132 是 windows 2003 32bit 2.82.3859 否 windows 2008 R2 64bit 6.1.7600.16385 是

??? 网上又找关于ADO的内存泄漏问题,确实有人也说发现这个现象,但都没有跟帖的人提出解决方法或原因。从ADO变成ADO.Net后,ADO微软已经好久没有维护了,最高版本是2.8就不管了。突然发现了这个网页:http://www.mskbfiles.com/msado15.dll.php,里面列出了ADO的主要文件的版本历史,里面居然有个最高版本2.82.4711.0,下载看看,还不是正式的补丁,还要写mail去要,写就写把,2.82那个只能用在windows2003上,XP还是只能用2.81,下载后更新上,版本变成2.81.3011,测试后还是不行。windows 2008 r2的ADO版本是6.1.7600.16385,更新后是6.1.7600.20589,测试后还是不行。

??? 是不是oledb for sqlserver的驱动问题呢(是不是SQLserver2008的问题),在windows 2003 sp2 64bit上安装sqlserver 2008,就不会泄漏,因此SQLServer 2008没有问题。所以就是ADO的问题了,在windows 2000Server和windows 2003 Server不会有泄漏,但是在windows XP和windows 2008 Server上有泄漏,等等看windows xp sp4和windows 2008 r2 sp1看能不能解决吧。

?

2012-1-4补:

windows 2008 r2 sp1上ADO的版本号是6.1.7601.17514,测试发现已经修正了这个问题。

实际修正是在6.1.7600.20589这个版本(2010年11月)。

Msado15.dll version 6.1.7600.20589:

  • 978042 FIX: A memory leak may occur when you use the Microsoft ActiveX Data Objects Library in Windows Vista,in Windows 7,in Windows Server 2008,or in Windows Server 2008 R2 Q978042 KB978042

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

??? 上个月公司1.8万买了一台dell服务器,于是拿来架设我们的软件做了压力测试,看看到底能负荷多少终端。安装了windows 2008 R2 Enterprise版本64位,数据库用sqlserver 2008 r2。测试发现可以到400台左右,但是发现连续运行两天后,出现out of memory错误了。

??? 首先,用fastmm检查内存泄漏,查来查去没有发现;又用AQTime,MemPrrof,BoundsChecker来查,都不得要领,说LStrFromWStr,或者AnsiAllocateStr有泄漏,都无从处理........

??? 是不是TMemoryStream或者TDataSet里面的资料越堆越多?一一检视每个常驻的TMemoryStream和TDataSet,也没有任何发现。

??? 网上google,有人说可能是内存碎片,特别是多线程下反复申请/释放内存容易产生很多的碎片,导致虚拟地址空间耗尽。是个理由,用TMemoryStream来测试,开100个线程,创建,Size:=100,Size:=8195;Size:=10,释放,确实可以看到虚拟内存一直涨。于是全部使用Pooling,也尽量在开始就创建好线程,Stream,DataSet,测试结果,还是涨........

??? 没办法了,去掉一些部分,把问题单纯化,发现访问数据库时会涨,不访问数据库不会涨。单独写个测试程序,果然,用ADODataSet反复打开关闭,内存就涨个不停。难道真是ADO的问题,可是我们的软件出去也很久了,都是7*24小时工作,如果有泄漏,早挂机N回了,为什么客户哪里不会呢?突然想起,公司内部的另一台服务器(windows 2003 32bit)上架了相同架构的另一个服务器软件,也是7*24运行,也没有看到内存爆掉啊。于是赶紧把这次的程序放到那台服务器上去跑跑看,大跌眼镜,哈哈,内存稳定了,那就与操作系统有关了。即:

    推荐文章
      热点阅读