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

文章翻译 文章翻译
文章编号: 312575 - 查看本文应用于的产品
本文已归档。它按“原样”提供,并且不再更新。
展开全部 | 关闭全部

本文内容

症状

具有大量(超过 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.dll
15-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.dll
15-Nov-2001                          Q312575_MDAC26_SP1_x86_en.exe	
				

替代方法

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

可以通过调整注册表中的下列设置来解决此问题:
HKLM\Software\Microsoft\MDAC         MaxReservedBlocks
HKLM\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- --,
				
在这两种情况下,使用性能监视器监视应用程序或服务时都会显示过量使用了虚拟字节。

属性

文章编号: 312575 - 最后修改: 2014年2月24日 - 修订: 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