.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.