ADO引起的伺服器記憶體洩漏

2021-09-30 07:59:14 字數 1502 閱讀 6866

上個月公司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是

是不是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這個版本(2023年11月)。

msado15.dllversion6.1.7600.20589:

記憶體故障引起ISA伺服器的奇怪問題

公司的isa 2004伺服器 dell optiplex gx270,作業系統是windows 2003 一直存在乙個奇怪問題 每次用遠端桌面遠端控 務器之後都無法正常登出,始終顯示正在登出畫面,只能強制斷開,一直以為是作業系統的問題。最近,這台伺服器又出現了另外乙個奇怪問題 在網路上的芳鄰無法找到...

安卓 Handler引起的記憶體洩漏

myhandler activity activity override public void handlemessage message msg 將 改為以上形式之後,就算完成了。還有一種就是當activity銷毀的時候,也就是在ondestroy 方法裡加上 mhandler.removeca...

Android 解決MVP引起的記憶體洩漏

首先不了解mvp模式的孩紙先去看一下mvp再閱讀本部落格嘍。使用mvp模式的主要作用,是它解決了業務邏輯和資料訪問的緊耦合,使presenter作為view和model的中間人,降低了資料和view的耦合度。所以mvp有很多有點 利於維護 易於測試 松耦合 復用性高,易於擴充套件。但由於presen...