ADO引起的服务器内存泄漏

    上个月公司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运行,也没有看到内存爆掉啊。于是赶紧把这次的程序放到那台服务器上去跑跑看,大跌眼镜,哈哈,内存稳定了,那就与操作系统有关了。即:

操作系统ADO版本是否会内存泄露
windows XP 32bit2.81.1132
windows 2003 32bit2.82.3859
windows 2008 R2 64bit6.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:

 

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

火星牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值