INFO: 공용 언어 런타임에서 메모리 누수 확인

기술 자료 번역 기술 자료 번역
기술 자료: 318263 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

이 페이지에서

요약

이 문서에서는 메모리 누수란 무엇이며 메모리 누수의 원인에 대해 설명합니다. 또한 감지된 메모리 누수와 이것이 실제 메모리 누수로 잘못 해석될 수 있는 상황에 대해 설명합니다.

추가 정보

메모리가 누수되면 응용 프로그램에 리소스가 부족할 수 있고 응용 프로그램이 충돌할 수 있습니다. 메모리 누수를 확인하는 것이 중요합니다. 메모리 누수 문제는 여러 해 동안 C 및 C++의 개발자들을 괴롭혔습니다. Microsoft Visual Studio .NET에서 포괄적인 가비지 수집 패키지 및 관리 메모리는 메모리 누수를 중지시킬 수 있지만 일부 환경에서는 프로그램으로 메모리가 누수되는 것처럼 나타날 수 있습니다.

메모리 누수의 정의

메모리 누수는 프로그램이 메모리를 사용하지 않는데 메모리가 프로그램에 할당되고 운영 체제에 반환되지 않는 경우에 발생합니다. 다음은 메모리 누수의 네 가지 기본 유형입니다.
  • 수동으로 관리되는 메모리 환경에서는 메모리가 동적으로 할당되고 포인터가 메모리를 참조합니다. 포인터는 메모리가 해제되기 전에 지워집니다. 포인터가 지워지면 메모리가 더 이상 액세스될 수 없으므로 해제될 수 없습니다.
  • 동적으로 관리되는 메모리 환경에서는 개체에 대한 참조가 계속 활성 상태이므로 메모리가 처분되지만 수집되지 않습니다. 개체에 대한 참조가 계속 활성 상태이므로 가비지 수집기는 해당 메모리를 절대로 수집하지 않습니다. 이것은 시스템 또는 프로그램으로 설정된 참조에서 발생할 수 있습니다.
  • 동적으로 관리되는 메모리 환경에서는 가비지 수집기가 메모리를 수집하고 해제할 수 있지만 이 메모리를 운영 체제에 반환하지 않습니다. 가비지 수집기가 사용되고 있는 개체를 메모리의 한 부분으로 이동할 수 없고 나머지 부분을 해제할 수 없는 경우 이런 경우가 발생합니다.
  • 메모리 환경에서는 많은 대형 개체가 선언되고 범위를 벗어날 수 없을 때 메모리가 잘못 관리될 수 있습니다. 따라서 메모리가 사용은 되지만 해제되지 않습니다.

토론

Microsoft .NET Framework에는 가비지 수집 패키지가 구현되어 있어서 관리된 코드에 메모리 누수가 발생할 수 없습니다. 이것으로 다음과 같은 두 가지 질문이 나올 수 있습니다. 어떻게 메모리 누수가 발생할 수 있습니까? 메모리 누수가 발생한 이유는 무엇입니까?

메모리 누수는 관리되지 않는 코드가 응용 프로그램의 일부로 사용될 때 .NET Framework 응용 프로그램에서 발생할 수 있습니다. 이 관리되지 않는 코드로 인해 메모리 누수가 발생할 수 있고 .NET Framework 런타임으로는 이 문제를 해결할 수 없습니다.

또한 프로젝트가 메모리 누수만 있는 것으로 나타날 수 있습니다. 이러한 상황은 많은 대형 개체(예: DataTable 개체)가 선언되고 모음(예: DataSet)에 추가되는 경우에 발생합니다. 이러한 개체가 소유하는 리소스는 해제될 수 없으며 이 리소스는 프로그램이 실행 중인 동안 활성 상태로 남아 있습니다. 누수가 있는 것처럼 나타나지만 실제로는 메모리가 프로그램에 할당되는 방식의 증상일 뿐입니다.

예를 들어, DataSet이 있습니다. 새 쿼리가 실행될 때마다 새 DataTable 요소를 DataSet에 추가하여 반환된 데이터를 보유합니다. 처분하지 않은 데이터가 많을 경우 DataSet이 계속 사용되고 있는 한 데이터는 활성 상태입니다. 이것이 여러 번 발생하면 메모리가 부족할 수 있습니다. 이것은 메모리 누수가 아닌 메모리 관리 문제입니다. 다음 코드 예제를 살펴보겠습니다.
  Dim DS As DataSet
  Dim cn As New SqlClient.SqlConnection("data source=localhost;initial catalog=Northwind;integrated security=SSPI")
  cn.Open()
 
  Dim da As New SqlClient.SqlDataAdapter("Select * from Employees", cn)
  Dim i As Integer
  DS = New DataSet()

  For i = 0 To 1000
      da.Fill(DS, "Table" + i.ToString)
  Next
				
참고: 이 예는 코드의 일부입니다. 이 예에서는 Microsoft SQL Server가 로컬 컴퓨터에 설치되어 있고 이 코드를 실행 중인 사용자에게 SQL Server에 포함된 Northwind 데이터베이스에 대한 액세스 권한이 있는 것으로 간주합니다.

이 코드가 비효율적이고 실용적이지 못하더라도 테이블이 DataSet 모음에 추가되는 것과 같이 개체가 모음에 추가되는 경우 모음이 활성 상태이기만 하면 이 개체는 활성 상태가 유지됩니다. 모음이 프로그램의 전역 수준으로 선언되고 개체가 프로그램 전체에서 선언되며 해당 모음에 추가되면 이 개체가 더 이상 범위 안에 없더라도 이 개체는 계속 참조되고 있으므로 활성 상태로 남아 있습니다.

이럴 때마다 프로그램이 사용하는 메모리의 양이 증가합니다. 프로그램이 끝나거나 모음의 개체가 릴리스되어야 메모리가 줄어듭니다. 성능 모니터에서 프로그램을 보면 메모리 누수가 있는 것처럼 나타나지만 실제로는 그렇지 않습니다. 프로그램에 여전히 메모리를 제어하는 권한이 있지만 이 메모리를 해제하지 않습니다. 프로그램에 여전히 제어 권한이 있어 메모리가 누수되지 못하게 하지만 프로그램이 사용된 메모리의 양을 계속 늘리면 메모리 누수가 있는 것처럼 보일 수 있습니다.

메모리 누수 증상

실행 중에 프로그램에 사용되는 메모리의 양이 계속 증가하면 이것이 바로 메모리가 누수되고 있는 증상입니다. 성능 모니터를 통해 이 메모리의 수를 볼 수 있습니다. 프로그램이 사용하는 메모리의 양으로 인해 결국 프로그램의 리소스가 부족할 수 있고 프로그램이 충돌할 수 있습니다.

참조

다음은 메모리 및 메모리 관리에 대한 자세한 내용이 들어 있는 도움말 항목의 목록입니다.
  • GC 클래스
  • 메모리 성능 카운터
  • 자동 메모리 관리
  • 관리되지 않는 코드와 상호 운용
자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
317297 INFO: Roadmap for Debugging Hangs, Memory Leaks, Deadlocks, and Race Conditions in Visual Basic .NET
자세한 내용은 다음 MSDN(Microsoft Developer Network) 웹 사이트를 방문하십시오.
메모리 누수 감지 및 차단
혼합 모드 디버깅
MFC의 메모리 누수 응용 프로그램
메모리 창




Microsoft 제품 관련 기술 전문가들과 온라인으로 정보를 교환하시려면 Microsoft 뉴스 그룹에 참여하시기 바랍니다.

속성

기술 자료: 318263 - 마지막 검토: 2005년 8월 16일 화요일 - 수정: 1.3
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft .NET Framework 서비스 팩 2
  • Microsoft Visual Studio .NET 2002 Professional Edition
  • Microsoft Visual Studio .NET 2002 Enterprise Architect
  • Microsoft Visual Studio .NET 2002 Enterprise Developer
  • Microsoft Visual Studio .NET 2002 Academic Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual J# .NET 2003 Standard Edition
키워드:?
kbinfo KB318263

피드백 보내기

 

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