修复: 重复的加载和卸载的 Mtxdm.dll 原因 1 MB 虚拟内存泄漏

文章翻译 文章翻译
文章编号: 232351
展开全部 | 关闭全部

本文内容

症状

当加载和卸载 Mtxdm.dll 在循环内,每次执行循环时,出现 1 MB 虚拟内存泄漏。

这是最可能发生在使用 ODBC 连接池并进行反复的连接和断开连接从后端数据库中的应用程序或 ODBC 应用程序,使许多连接和断开连接到 Oracle 的后端。

原因

在虚拟内存泄漏是由 TerminateThread() Mtxdm.dll 中的调用所致。

ODBC 应用程序中使用连接池时,加载分配器管理器 (Mtxdm.dll) 来管理连接池,由 Mtxdm.dll 内启动辅助线程处理的。

当应用程序结束时,辅助线程被终止通过调用 TerminateThread(),它不会清除并释放分配给工作线程的堆栈内存的 1 MB。

同样的行为可以看到时反复的连接和断开连接到 Oracle 数据库服务器中,因为 Microsoft Oracle ODBC 驱动程序会将 Mtxdm.dll 是否连接池正在使用或不。

解决方案

要解决此问题,请获取最新的 service pack,Windows NT 4.0 或各个软件更新。有关如何获取最新的服务包的信息,请访问:
有关获取各个软件更新的信息,请与 Microsoft 产品支持服务联系。有关 Microsoft 产品支持服务电话号码和关于支持费用的信息的完整列表,请访问下面的地址在万维网上:
http://support.microsoft.com/default.aspx?scid=fh ;美国英语 ;CNTACTMS

Windows NT 服务器或工作站 4.0

要解决此问题,请获取最新的 service pack,Windows NT 4.0 或各个软件更新。有关如何获取最新的服务包的信息,请访问:
  • Windows 服务包中心-或者-

  • 152734如何获取最新的 windows nt 4.0 服务包
有关获取各个软件更新的信息,请与 Microsoft 产品支持服务联系。有关 Microsoft 产品支持服务电话号码和关于支持费用的信息的完整列表,请访问下面的地址在万维网上:
http://support.microsoft.com/default.aspx?scid=fh ;美国英语 ;CNTACTMS

Windows NT 服务器 4.0 中,终端服务器版

要解决此问题,请获取最新的 service pack,为 Windows NT Server 4.0 终端服务器版。其他信息,请单击下面的文章编号,以查看在文章微软知识文库:
152734 如何获取最新的 Windows NT 4.0 服务包

状态

Microsoft 已经确认这是在本文开头列出的 Microsoft 产品中的问题。 此问题最早在 Windows NT 服务器版本 4.0 中,终端服务器版服务包 6。

详细信息

手动安装的修补程序 051099a

注意: 要获得此修补程序,则必须联系 Microsoft 产品支持服务。请参阅本文中的详细信息的解决方案一节。
  1. 关闭或停止任何应用程序或服务使用的 Mtxdm.dll。这可能包括 Internet 信息服务器 (IIS)、 Microsoft 事务服务器 (MTS)、 Microsoft 分布式事务处理协调器 (DTC) 和所有 ADO 或 ODBC 应用程序。
  2. 下载的修补程序 (051099a.exe) 到临时目录并运行来解压缩以下文件:
    • Mmtxdm.dll
    • Readme.txt
  3. 定位和重命名当前版本的 Mtxdm.dll,这应该是 Windows NT 的计算机,否则文件夹中,并在 Windows 9x 计算机的 \Windows\System 文件夹中。
  4. 将 Mtxdm.dll 的修补程序版本复制到相同的位置,并重新启动您的服务和应用程序。

重现问题的步骤

创建使用下面的代码的 C/c + + 控制台应用程序。运行此应用程序时使用性能监视器来查看应用程序的虚拟字节为单位)。

注意: 此代码示例使用 ODBC 数据源连接到 Oracle 后端,这是因为 Microsoft Oracle ODBC 驱动程序会将 Mtxdm.dll,并更方便地演示了此问题。
   #include        <windows.h>
   #include        <stdio.h>
   #include        <sql.h>
   #include        <sqlext.h>
   #include        <assert.h>

   #define CK_RT(x) if( x != SQL_SUCCESS && x != SQL_SUCCESS_WITH_INFO)    assert(0)

   void main(){
       HENV        henv;
       HDBC        hdbc;
       RETCODE     rc = SQL_SUCCESS;
       char        *dsnStr="DSN=OracleServer;UID=scott;pwd=tiger;";
       short       rtnLen = 0;
       UCHAR       rtnDSN[999] = "";
       int         i,x;


       for (i=0; i < 100; i++)
   	{
               rc = SQLAllocEnv(&henv);
               CK_RT(rc);
               rc = SQLAllocConnect(henv, &hdbc);
               CK_RT(rc);
               rc = SQLDriverConnect(hdbc,
                         NULL,
                         (unsigned char *)dsnStr,
                         strlen(dsnStr),
                         rtnDSN,
                         255,
                         &rtnLen,
                         SQL_DRIVER_NOPROMPT);

               CK_RT(rc);
               SQLDisconnect(hdbc);
               SQLFreeConnect(hdbc);
               SQLFreeEnv(henv);
	   }
   }
				

属性

文章编号: 232351 - 最后修改: 2012年6月13日 - 修订: 3.0
关键字:?
kbqfe kbhotfixserver kbbug kbfix kbmdac210fix kbmts200fix kbsdkodbc351fix kbvirtualmem kbmt KB232351 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 232351
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