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