FIX:同時開啟大量資料錄集時發生虛擬記憶體遺漏

文章翻譯 文章翻譯
文章編號: 312575 - 檢視此文章適用的產品。
本文已封存。本文係以「現狀」提供且不會再更新。
全部展開 | 全部摺疊

在此頁中

徵狀

當應用程式或服務有大量 (500 個以上) 同時開啟的 ActiveX Data Objects (ADO) 資料錄集頻繁地開啟和關閉時,可能會發生虛擬記憶體遺漏的現象,因而導致記憶體分散以及記憶體不足的錯誤。

這個問題可能發生在 Microsoft Data Access Components (MDAC) 2.5 RTM (2.50.4403.12) 到 2.6 SP1 (2.61.7326.6) 之間的任何版本,但不會發生在 MDAC 2.7 版中。

這個問題並不限於特定提供者,它可能發生於 SQL Server Native Provider (Sqloledb.dll)、Oracle Native Provider (Msdaora.dll)、ODBC 提供者 (Msdasql.dll)、用戶端 Cursor Engine 以及任何使用共享記憶體程式碼的元件。

發生的原因

當釋放資料錄集時,MDAC 記憶體管理常式會將配置給資料錄集的記憶體儲存在一份對應 (look-aside) 清單中,而不會真正釋放記憶體。這項作業是為了避免完全釋放記憶體並重新進行配置所造成的負荷。

依照預設,MDAC 2.5 (Msdatl2.dll) 和 MDAC 2.6 (Msdatl3.dll) 所使用的共享記憶體管理程式碼最多會儲存 500 個配置,超過這個數目的配置會透過呼叫 VirtualFree 函數加以釋放。

記憶體管理程式碼中的編碼會錯誤呼叫 VirtualFree,因此不會真正釋放記憶體。VirtualFree 傳回的程式碼不會經過檢查,因此應用程式不會收到記憶體遺漏的指示。

解決方案

如果要解決這個問題,請取得最新版的 Microsoft MDAC 2.5 Service Pack。如需其他詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
293312 INFO:如何取得最新的 MDAC 2.5 Service Pack
此修正程式的英文版本應具有下面的檔案屬性或更新版本:

MDAC 2.5 SP2
摺疊此表格展開此表格
日期版本大小檔名
25-Oct-20012.52.8025.078,096Msdatl2.dll
25-Oct-20012.52.8025.053,520Msdatt.dll
25-Oct-20012.52.8025.0303,376Msdasql.dll
25-Oct-20012.52.8025.016,384Msdasqlr.dll
15-Nov-2001Q312575_MDAC25_SP2_x86_en.exe
僅供 MDAC 2.5 使用:如果要解決這個問題,請取得最新版的 Windows 2000 Service Pack。如需其他詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
260910 如何取得最新版的 Windows 2000 Service Pack
MDAC 2.6 SP1
摺疊此表格展開此表格
日期版本大小檔名
25-Oct-20012.61.8025.094,480Msdatl3.dll
25-Oct-20012.61.8025.024,848Msdatt.dll
25-Oct-20012.61.8025.0307,472Msdasql.dll
25-Oct-20012.61.8025.016,384Msdasqlr.dll
15-Nov-2001Q312575_MDAC26_SP1_x86_en.exe

其他可行方案

如果要解決這個問題,請將應用程式或服務的設計改為同時開啟 500 個以下的資料錄集。

您也可以調整以下的登錄設定,減輕這個問題造成的影響:
HKLM\Software\Microsoft\MDAC         MaxReservedBlocks
HKLM\Software\Microsoft\MDAC         ReservedMemorySize
				
請注意,這些登錄設定依照預設並不存在,您需要手動加上這些設定。這兩種設定都是 DWORD 值。

MaxReservedBlocks 的預設值為 500。如果您增加這個值,記憶體管理員的對應 (look-aside) 清單中會儲存更多的記憶體區塊 (因此會造成應用程式的記憶體用量更大),但會重複使用這些區塊。如果您降低這個值,會增加記憶體遺漏的比率。

ReservedMemorySize 的預設值為 1 MB。您可以降低這個值,限制虛擬記憶體的配置大小;不過,如果所需的記憶體超過記憶體區塊中的可用量,這麼做可能會降低效能。

狀況說明

Microsoft 已確認本篇文章開頭所列之 Microsoft 產品確實有上述問題。

MDAC 2.5

本問題在 Microsoft MDAC 2.5 Service Pack 3 中獲得第一次修正。 本問題在 Windows 2000 Service Pack 3 中獲得第一次修正。

其他相關資訊

在 MDAC 2.5 中,遺漏的記憶體配置將會完全由保留的記憶體所組成,也不會有交付分頁,例如:
摺疊此表格展開此表格
08230000,Private,1048576,1,-RW-,
08230000,Reserve,1048576,,-RW---,
08330000,Private,1048576,1,-RW-,
08330000,Reserve,1048576,,-RW---,
08430000,Private,1048576,1,-RW-,
08430000,Reserve,1048576,,-RW---,
08530000,Private,1048576,1,-RW-,
08530000,Reserve,1048576,,-RW---,
在 MDAC 2.6 中,遺漏的記憶體配置會包含至少 10 KB (65536 位元組) 的交付分頁,例如:
摺疊此表格展開此表格
1BF60000,Private,1048576,2,-RW-,
1BF60000,Private,65536,,-RW---,
1BF70000,Reserve,983040,,-RW---,
1C060000,Private,1048576,2,-RW-,
1C060000,Private,65536,,-RW---,
1C070000,Reserve,983040,,-RW---,
1C160000,Private,1048576,2,-RW-,
1C160000,Private,65536,,-RW---,
1C170000,Reserve,983040,,-RW---,
在任何一種情況中,以「效能監視器」監控應用程式或服務時,都會顯示過度使用虛擬位元組的情形。

屬性

文章編號: 312575 - 上次校閱: 2014年2月26日 - 版次: 4.0
這篇文章中的資訊適用於:
  • Microsoft Data Access Components 2.5
  • Microsoft Data Access Components 2.5 Service Pack 1
  • Microsoft Data Access Components 2.5 Service Pack 2
  • Microsoft Data Access Components 2.6
  • Microsoft Data Access Components 2.6 Service Pack 1
關鍵字:?
kbnosurvey kbarchive kbbug kbfix kbqfe kbwin2000sp3fix kbmdac260fix kbmdac250sp3fix kbhotfixserver KB312575
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com