上个月公司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 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 总结以上是内存溢出为你收集整理的ADO引起的服务器内存泄漏全部内容,希望文章能够帮你解决ADO引起的服务器内存泄漏所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)