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就不管了。突然发现了这个网页:,里面列出了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

而有的旅行是释放负面情绪,换个心情,轻装上阵。

ADO引起的服务器内存泄漏

相关文章:

你感兴趣的文章:

标签云: