FIX: ADO 2.5 스트림 및 Record 개체를 사용하면 리소스 누수된다

기술 자료 번역 기술 자료 번역
기술 자료: 282177 - 이 문서가 적용되는 제품 보기.
이 문서가 보관되었습니다. "그대로" 제공되었으며, 업데이트가 되지 않을 것입니다.
모두 확대 | 모두 축소

이 페이지에서

현상

때 마샬링 데이터 레코드 ADO (ActiveX 데이터 개체) 사용하여 프로세스 또는 Stream 개체, 메모리 누수가 발생할 결국 메모리가 부족하여 프로세스를 발생할 수 있습니다. 명령Recordset 개체 등의 다른 ADO 개체와 이 누수가 발생하지 않습니다.

이 누수는 Microsoft 데이터 액세스 구성 요소 (MDAC) 2.5 발생하지만 MDAC 2.6 발생하지 않습니다.

원인

RecordStream 개체를 ATL (액티브 템플릿 라이브러리) AtlMarshalPtrInProc 함수를 다시 호출자에게 프록시 정보를 보내는 데 사용되는 스트림을 만들 수 있습니다. RecordStream 개체가 파괴된 경우 릴리스 함수는 사용하여 스트림에서 이 스트림에 할당된 메모리를 해제하려고 AtlFreeMarshalStream 함수를 호출하지 않고 필드라고 합니다.

해결 방법

MDAC

이 문제를 해결하려면 Microsoft MDAC 2.5 최신 서비스 팩을 구하십시오. 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
293312정보: 최신 MDAC 2.5 구하는 방법 서비스 팩
이 수정의 영어 버전은 다음 파일 특성을 가집니다 또는 나중에:
   Date          Version        Size               File name
   ------------------------------------------------------------

   12/14/2000    2.53.6013.0    491,792 bytes      Msado15.dll	
	
				

Windows 2000

이 문제를 해결하려면 Windows 2000용 최신 서비스 팩을 구하십시오. 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
260910최신 Windows 2000 서비스 팩을 구하는 방법
이 수정의 영어 버전은 다음 파일 특성을 가집니다 또는 나중에:
   Date        Time    Version       Size       File name
   ----------------------------------------------------------
   5/29/2001   02:56p  2.52.6019.1   487,696    Msado15.dll
				

해결 방법

MDAC 2.5이 이 문제에 대한 해결 방법은 없습니다 있습니다.

현재 상태

MDAC

Microsoft는 이 문서의 시작 부분에 나열한 제품에서 문제를 확인했습니다. 이 문제는 Microsoft MDAC 2.5 서비스 팩 3에서 처음 해결되었습니다.

MDAC 2.6이 이 문제가 발생하지 않습니다.

Windows 2000

Microsoft 문제는 이 문서의 시작 부분에 나열한 제품에서 문제를 확인했습니다. 이 문제는 Windows 2000 서비스 팩 3에서 처음 해결되었습니다.

추가 정보

레코드 또는 스트림 개체는 마샬링된 프로세스, Microsoft 인터넷 정보 서버 (IIS) 및 Microsoft 트랜잭션 서버 (MTS) 같은 위치 환경에서는 주로 이 메모리 누수가 발생하는/COM +. 여기서 이 마샬링, 독립 실행형 Microsoft Visual Basic 응용 프로그램 같은 발생하지 환경에서 이 누수가 발생하지 않습니다.

문제를 재현하기 위한 단계

  1. 아래의 예제 코드를 텍스트 파일에 붙여 및 "ADODBMem.vbs" 이름으로 저장하십시오.
  2. 명령 프롬프트에서 Windows 스크립트 호스트 (CScript.exe가)를 사용하여 이 파일을 실행하십시오. 예를 들면:
    cscript ADODBMem.vbs
  3. 메시지가 나타나면 성능 모니터 (PerfMon)를 시작하고 실행 CScript에 대한 전용 바이트 카운터가 선택하십시오.
  4. 해당 스크립트에 반환하여 표시된 대로 ADO 개체 만드는 과정을 단계별로. PerfMon RecordStream 개체가 할당된 메모리 양이 증가하고 보여 유의하십시오.

예제 코드

'//////////////////////////////////////////////////////////////////////////////////////////////// 
' +
'   File:       adodbmem.vbs
'
'   Copyright:  (c) 2000 Microsoft Corporation
'
'   Contents:   Creates/destroys ADODB objects and allows to see memory usage (leaks).
'
'   Comments:   CScript.exe v2.0 required (comes with Windows 2000; just copy to run under NT4)
'               WScript.exe will NOT work
'
'               Usage: cscript adodbmem.vbs
'               Use PerfMon to see the counter "Private Bytes" in process "cscript"
' -
'//////////////////////////////////////////////////////////////////////////////////////////////// 

Const REPT_CNT = 1000

Private Function CreateOnce(objName, bStop)
  Dim obj
  On Error Resume Next
  If bStop = True Then
    WScript.StdOut.Write  "Create an instance of " & objName & ">"
    WScript.StdIn.ReadLine
  End If
  Set obj = CreateObject(objName)
  If Err.Number <> 0 Then
    WScript.Echo "CreateObject(" & objName &") failed: " & Err.Description
    CreateOnce = False
    Exit Function
  End If
  If bStop = True Then
    WScript.StdOut.Write objName & " created. Destroy>"
    WScript.StdIn.ReadLine
  End If
  Set obj = Nothing
  If bStop = True Then
    WScript.Echo objName & " destroyed."
  End If
  CreateOnce = True
End Function

'//////////////////////////////////////////////////////////////////////////////////////////////// 

Private Sub TryObject(objName)
  Dim i
  WScript.StdOut.Write "Create and destroy " & objName & " " & REPT_CNT & " times>"
  WScript.StdIn.ReadLine
  For i = 1 To REPT_CNT
    If Not CreateOnce(objName, False) Then Exit For
  Next
  WScript.StdOut.Write "Done. "
End Sub

'//////////////////////////////////////////////////////////////////////////////////////////////// 

Private Sub ShowVersion
  Dim sVer
  Dim o
  Set o = CreateObject("ADODB.Connection")
  sVer = o.Version
  Set o = Nothing
  WScript.StdOut.Write "ADODB version " & sVer & " loaded. Hit Enter to start>"
  WScript.StdIn.ReadLine
End Sub

'//////////////////////////////////////////////////////////////////////////////////////////////// 

Public sub Main()
  WScript.StdOut.Write "ADODB memory leak test." & vbNewLine & _
                "Connect Perfmon: process - cscript, counters - Private Bytes." & vbNewLine & _
                "Hit Enter then ready>"
  WScript.StdIn.ReadLine
  ShowVersion

  TryObject "ADODB.Command"
  TryObject "ADODB.Stream"
  TryObject "ADODB.Recordset"
  TryObject "ADODB.Record"

  WScript.StdOut.Write "All Done. Hit Enter to exit>"
  WScript.StdIn.ReadLine
End sub

Call Main()
Wscript.Quit 0

'//////////////////////////////////////////////////////////////////////////////////////////////// 
'                                  End of file "adodbmem.vbs"
'//////////////////////////////////////////////////////////////////////////////////////////////// 

				

속성

기술 자료: 282177 - 마지막 검토: 2014년 2월 24일 월요일 - 수정: 3.2
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Data Access Components 2.5 서비스 팩 1
  • Microsoft Data Access Components 2.5
키워드:?
kbnosurvey kbarchive kbmt kbhotfixserver kbqfe kbmdac250sp3fix kbado260fix kbbug kbfix kbmdac260fix kbwin2000sp3fix KB282177 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. 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