.NET에서 "관리되는"리소스와 "관리되지 않는"리소스는 무엇을 의미합니까?


답변:


80

일반적으로 "관리되지 않는 리소스"라는 용어 는 가비지 수집기의 직접 제어를받지 않는 항목을 설명하는 데 사용됩니다 . 예를 들어 데이터베이스 서버에 대한 연결을 열면 공급자가 관리 코드로 완전히 작성되지 않은 경우 서버의 리소스 (연결 유지를 위해)와 클라이언트 컴퓨터의 다른 비 .net 리소스가 사용됩니다.

이것이 데이터베이스 연결과 같은 경우 코드를 다음과 같이 작성하는 것이 좋습니다.

using (var connection = new SqlConnection("connection_string_here"))
{
    // Code to use connection here
}

이렇게하면 .Dispose()연결 개체에서 호출되므로 관리되지 않는 리소스가 정리됩니다.


20
나는 그것을 약간 명확히하고 싶다 : "관리되지 않는 자원"은 그것이 버려진 경우 쓰레기 수집가가 정리하는 방법을 알지 못하는 무언가이다. 예를 들어, 수명이 긴 개체의 이벤트에 대한 단기 개체의 구독은 GC가 구독을 알 수있는 방법이 없기 때문에 두 개체가 가비지 수집기의 제어를받는 경우에도 관리되지 않는 리소스가됩니다. 구독자가 포기되었지만 게시자는 그렇지 않은 경우 폐기해야합니다. 제한없는 수의 구독자가 게시자의 수명 동안 만들어지고 중단 될 수있는 경우 메모리 누수가 발생합니다.
supercat

12
좀 더 명확한 설명 추가 : SqlConnection (또는 FileStream 등)은 GC가 인식하지 못하는 관리되지 않는 리소스를 내부적으로 사용하는 관리 리소스입니다.
jimvfr

2
jimvfr이 맞고 SqlConnection은 관리되는 리소스의 예입니다. 관리되지 않는 리소스의 예는 Marshal.AllocHGlobal () 메서드를 사용하여 관리되지 않는 메모리에서 메모리를 할당해야하는 경우입니다.이 경우 관리되지 않는 리소스는 소멸자 (~ ctor)를 사용하고 Marshal.FreeHGlobal ()을 호출하는 것입니다. 이 메모리를 해제합니다.
Ygor 토 마즈

관리되는 리소스와 관리되지 않는 리소스 모두에 대한 예를 들어 주시겠습니까?
Radha Manohar

32

관리되는 리소스는 순수한 .NET 코드이고 런타임에 의해 관리되며 직접 제어되는 리소스입니다.

관리되지 않는 리소스는 그렇지 않은 리소스입니다. 파일 핸들, 고정 된 메모리, COM 개체, 데이터베이스 연결 등


13

Q & A 에서 관리되지 않는 리소스 란 무엇입니까? 1 , Bruce Wood 는 다음을 게시했습니다.

"관리"및 "관리되지 않음"이라는 용어를 다음과 같이 생각합니다.

"관리 됨" 은 .NET 샌드 박스 내의 모든 것을 나타냅니다. 여기에는 모든 .NET Framework 클래스가 포함됩니다.

"관리되지 않음" 은 .NET 샌드 박스 외부의 황야를 나타냅니다. 여기에는 Win32 API 함수 호출을 통해 반환되는 모든 것이 포함됩니다.

당신이 경우 결코 는 Win32 API 함수를 호출하지 않으며 결코 어떤 Win32에서 "핸들"개체를 다시 얻을, 당신은 어떤 관리되지 않는 리소스를 보유하지 않습니다. .NET Framework 클래스 메서드를 통해 여는 파일과 스트림은 모두 관리되는 래퍼입니다.

설명 : 관리되지 않는 리소스를 직접 보유하고 있지 않을 수 있습니다 . 그러나 System.IO.FileStream 과 같은 관리되는 "래퍼 클래스"를 통해 간접적으로 관리되지 않는 리소스를 보유 할 수 있습니다 . 이러한 래퍼 클래스는 일반적으로 IDisposable을 구현합니다 (직접 또는 상속을 통해).

... 많은 관리되는 (.NET Framework) 개체가 관리되지 않는 리소스를 내부에 보유하고 있으므로 가능한 한 빨리 Dispose ()하거나 호출자에게 그렇게 할 수있는 기회를 제공 할 수 있습니다. 여기에서 자신 만의 Dispose () 메서드를 작성합니다. 기본적으로 IDisposable ()을 구현하면 두 가지 작업이 수행됩니다.

  1. .NET의 뒤에서 운영 체제에서 직접 확보 한 리소스 (관리되지 않는 리소스)를 제거 할 수 있습니다.

  2. 당신과 당신의 발신자는 당신 / 당신의 발신자가 지금 풀고 싶어하는 귀중한 자원을 귀중한 자원을 가지고있는 무거운 .NET 개체 / .NET 개체를 해제 할 수 있습니다 .

설명 : 메서드 를 구현 IDisposable하고 제공함으로써 Dispose()클래스의 사용자가 클래스 인스턴스가 보유한 관리되지 않는 리소스를 결정적 방식 으로 해제 할 수 있습니다.


1 원래 Sachin Shanbhag의 답변 에서 공유 된 링크 . 2005-11-17 일자 인용 자료. 인용 된 내용을 가볍게 복사 편집했습니다.


5

관리되는 리소스와 관리되지 않는 리소스의 기본적인 차이점은 가비지 수집기가 모든 관리되는 리소스에 대해 알고 있다는 것입니다. 어느 시점에서 GC는 관리 대상 개체와 관련된 모든 메모리와 리소스를 정리합니다. GC는 파일, 스트림 및 핸들과 같은 관리되지 않는 리소스에 대해 알지 못하므로 코드에서 명시 적으로 정리하지 않으면 메모리 누수 및 잠긴 리소스가 발생합니다.

자세한 내용-http: //bytes.com/topic/c-sharp/answers/276059-what-unmanaged-resources


1
"IDisposable 인터페이스의 기본 개념은 결정적인 방식으로 리소스를 정리하고 관리되지 않는 리소스를 정리하는 것입니다."
zionpi 2013

0

관리되는 리소스는 가비지 수집기에 의해 해제 될 수있는 리소스이며 관리되지 않는 리소스는이 목적을 위해 가비지 수집기에 의해 해제 될 수 없습니다. 소멸자가 필요합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.