FIX:虚拟内存因为同时打开大量记录集而泄漏

本文已归档。它按“原样”提供,并且不再更新。
症状
具有大量(超过 500 个)同时打开的 ActiveX 数据对象 (ADO) 记录集(频繁地打开和关闭)的应用程序或服务可能会出现虚拟内存泄漏,导致内存碎片和内存不足错误。

2.5 RTM (2.50.4403.12) 至 2.6 SP1 (2.61.7326.6) 之间的任意版本的 Microsoft 数据访问组件 (MDAC) 中都可能出现此问题。MDAC 2.7 中不会出现此问题。

此问题不是特定于提供程序的;SQL Server 本机提供程序 (Sqloledb.dll)、Oracle 本机提供程序 (Msdaora.dll)、ODBC 提供程序 (Msdasql.dll)、客户端游标引擎以及任何使用共享内存代码的组件都可能会出现此问题。
原因
释放记录集后,MDAC 内存管理例程会将为其分配的内存保存在一个“备用”列表中,而不是实际地释放这些内存。这样做是为了避免因完全释放和重新分配内存而产生的系统开销。

默认情况下,MDAC 2.5 (Msdatl2.dll) 和 MDAC 2.6 (Msdatl3.dll) 使用的共享内存管理代码可保存最多 500 次内存分配;超过此数量的内存将通过调用 VirtualFree 函数得到释放。

内存管理代码中的一个编码错误会错误地调用 VirtualFree,因此内存实际上没有被释放。VirtualFree 返回的代码没有被检查,应用程序不会收到内存泄漏的指示。
解决方案
要解决此问题,请获取最新的 Microsoft MDAC 2.5 Service Pack。有关其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
293312INFO: How to Obtain the Latest MDAC 2.5 Service Pack
该修复程序的英文版应具有以下或更新的文件属性:

MDAC 2.5 SP2
日期		版本		大小	文件名---------------------------------------------------25-Oct-2001	2.52.8025.0	78,096	Msdatl2.dll		25-Oct-2001	2.52.8025.0	53,520	Msdatt.dll		25-Oct-2001	2.52.8025.0	303,376	Msdasql.dll	25-Oct-2001	2.52.8025.0	16,384	Msdasqlr.dll15-Nov-2001                          Q312575_MDAC25_SP2_x86_en.exe				
仅限于 MDAC 2.5:要解决此问题,请获取最新的 Windows 2000 Service Pack。有关其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
260910 如何获取最新的 Windows 2000 Service Pack
MDAC 2.6 SP1
日期		版本		大小     文件名-----------------------------------------------------25-Oct-2001	2.61.8025.0	94,480   Msdatl3.dll	25-Oct-2001	2.61.8025.0	24,848   Msdatt.dll	25-Oct-2001	2.61.8025.0	307,472  Msdasql.dll	25-Oct-2001	2.61.8025.0	16,384   Msdasqlr.dll15-Nov-2001                          Q312575_MDAC26_SP1_x86_en.exe					

替代方法
要变通解决此问题,您可以将应用程序或服务设计为可同时打开最多 500 个记录集。

可以通过调整注册表中的下列设置来解决此问题:
HKLM\Software\Microsoft\MDAC         MaxReservedBlocksHKLM\Software\Microsoft\MDAC         ReservedMemorySize				
请注意,默认情况下这些注册表条目并不存在;您需要手动添加它们。这两个条目都是 DWORD 值。

MaxReservedBlocks 的默认值为 500。如果增加该值,内存管理器的备用列表中将保存更多个块(因此将会增加应用程序中的内存使用量),但这些块将被重用。如果减小该值,内存泄漏的速度将会增加。

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
属性

文章 ID:312575 - 上次审阅时间:02/24/2014 12:54:14 - 修订版本: 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
反馈