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

本文已封存。本文係以「現狀」提供且不會再更新。
徵狀
當應用程式或服務有大量 (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         MaxReservedBlocksHKLM\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---,
在任何一種情況中,以「效能監視器」監控應用程式或服務時,都會顯示過度使用虛擬位元組的情形。
kbMDAC virtual memory reserved leak maxreservedblocks reservedmemorysize large number recordsets open simultaneously concurrently fragmentation 500 out of
內容

文章識別碼:312575 - 最後檢閱時間:02/26/2014 18:10:51 - 修訂: 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
意見反應