C\#쓰레기 회수 메커니즘 에 대한 간단 한 설명

C\#쓰레기 회수 체 제 를 이해 합 니 다.먼저 CLR(공공 언어 가 실 행 될 때 Common Language Runtime)은 자바 가상 컴퓨터 와 마찬가지 로 실 행 될 때 환경 입 니 다.핵심 기능 은 메모리 관리,프로그램 집합 로드,안전성,비동기 처리 와 스 레 드 동기 화 를 포함 합 니 다.
CTS(Common Type System)유 니 버 설 형식 시스템 은.Net 의 유형 을 2 가지 유형 으로 나 누 어 참조 유형 과 값 유형 으로 나 눕 니 다.Net 의 모든 유형 은 System.Object 형식 으로 간접 적 으로 또는 직접 파생 됩 니 다.모든 값 형식 은 System.ValueType 의 하위 클래스 이 고 System.ValueType 자 체 는 인용 형식 입 니 다.
위탁 관리 자원:CLR 이 관리 하 는 위탁 관리 더미 에 존재 하 는 것 을 위탁 관리 자원 이 라 고 합 니 다.여기 에는 두 가지 관건 이 있 습 니 다.첫 번 째 는 CLR 이 관리 하고 두 번 째 저장 은 위탁 관리 더미 에 있 습 니 다.위탁 관리 자원 의 회수 작업 은 인공 적 으로 관여 할 필요 가 없 으 며,CLR 은 적절 한 시기 에 GC(쓰레기 수 거 기)를 호출 하여 회수 할 것 이다.
비 위탁 관리 자원:비 위탁 관리 자원 은 CLR 에 의 해 관리 되 지 않 습 니 다.예 를 들 어 Image Socket,StreamWriter,Timer,Tooltip,파일 핸들,GDI 자원,데이터 베이스 연결 등 자원(여기 서 자주 사용 하 는 몇 가지 만 열거 합 니 다).이 자원 GC 는 자동 으로 회수 되 지 않 으 므 로 수 동 으로 방출 해 야 한다.
위의 설명 을 통 해 첫째,GC(쓰레기 회수 기)는 위탁 관리 자원 만 회수 하고 비 위탁 관리 자원 은 회수 하지 않 는 다.둘째,GC 회 수 는 적절 한 시기(CLR 이 회수 해 야 한다 고 생각 할 때)에 회수 해 야 한다.그렇다면 비 위탁 관 리 는 어떻게 회수 합 니까?다음은 제 가 일일이 말씀 드 리 겠 습 니 다.
.Net 에서 비 위탁 관리 자원 을 방출 하 는 것 은 주로 두 가지 방식 이 있 는데,Dispose,Finalize 이다.
Dispose 방법 은 대상 이 IDisposable 인 터 페 이 스 를 계승 하려 면 Dispose 방법 을 자동 으로 호출 합 니 다.

Class Suifeng:System.IDisposable
{
    #region IDisposable

     public void Dispose()
     {
         //
     }

     #endregion
}

Suifeng suiFeng= new Suifeng ();

suiFeng.Dispose();

// Using
(using Suifeng suiFeng= new Suifeng())
{
     //
}

Finalize()방법
MSDN 의 정 의 는 대상 이'쓰레기 수 거'를 회수 하기 전에 자원 을 방출 하고 다른 청소 작업 을 수행 하도록 허용 하 는 것 이다.그것 의 본질은 바로 분석 함수 이다.

class Car
{
    ~Car()  // destructor
    {
        // cleanup statements...
    }
}
이 분석 함 수 는 대상 의 기본 클래스 를 Finalize 로 암시 적 으로 호출 합 니 다.이렇게 하면 앞의 석조 함수 코드 는 다음 코드 로 암시 적 으로 변 환 됩 니 다.

protected override void Finalize()
{
    try
    {
        // Cleanup statements...
    }
    finally
    {
        base.Finalize();
    }
}
.NET 에 서 는 가능 한 한 석조 함수 로 자원 을 적 게 방출 해 야 한다.MSDN 2 에 서 는 Finalize 방법 이나 석조 함수 가 성능 에 부정적인 영향 을 미 칠 수 있 으 므 로 불필요 하 게 사용 하지 않도록 해 야 한다.Finalize 방법 으로 대상 이 사용 하 는 메모 리 를 회수 하려 면 최소 두 번 의 쓰레기 회수 가 필요 합 니 다.쓰레기 수 거 기 는 수 거 를 실행 할 때 종결 기 가 없 는 접근 할 수 없 는 대상 의 메모리 만 회수 합 니 다.이 때 는 종결 기 가 있 는 접근 할 수 없 는 대상 을 회수 할 수 없다.이 대상 들 의 항목 을 종료 대기 열 에서 제거 하고 종 료 를 준비 하 는 대상 목록 에 배치 하 는 것 으로 바 뀌 었 습 니 다.이 목록 의 항목 은 위탁 관리 더미 에서 종료 코드 를 호출 할 대상 을 가리 키 고 있 습 니 다.쓰레기 수 거 기 는 이 목록 의 대상 을 Finalize 방법 으로 호출 한 후 이 항목 을 목록 에서 제거 합 니 다.이후 쓰레기 수 거 는 종 료 된 대상 이 쓰레기 임 을 확인 할 것 이다.종 료 를 준비 하 는 대상 으로 표 시 된 목록 의 항목 이 더 이상 가리 키 지 않 기 때문이다.이후 쓰레기 수 거 에서 대상 의 메모 리 를 사실상 회수 했다.
따라서 석조 함수 의 대상 이 있 으 면 두 번,첫 번 째 는 석조 함 수 를 호출 하고 두 번 째 는 대상 을 삭제 해 야 합 니 다.또한 분석 함수 에 대량의 방출 자원 코드 를 포함 하면 쓰레기 회수 기의 작업 효율 을 낮 추고 성능 에 영향 을 줄 수 있다.따라서 비 위탁 관리 자원 을 포함 하 는 대상 에 대해 서 는 쓰레기 회수 기 에 의존 하지 않 고 Dispose()방법 으로 자원 을 회수 하 는 것 이 좋 습 니 다.   비 위탁 관리 자원 을 포함 하 는 클래스 에서 자원 방출 에 관 한 표준 방법 은 다음 과 같다.   IDisposable 인터페이스 계승 하기;   Dispose()방법 을 실현 하고 그 중에서 위탁 관리 자원 과 비 위탁 관리 자원 을 방출 하 며 대상 자 체 를 쓰레기 회수 기 에서 제거 합 니 다(쓰레기 회수 기 는 이 자원 을 회수 하지 않 습 니 다).   클래스 분석 함 수 를 실현 하고 그 중에서 비 위탁 관리 자원 을 방출 합 니 다.   MSDN 의 소스 코드 를 보 세 요.  

Public class BaseResource:IDisposable
   {
      PrivateIntPtr handle; // ,
      PrivateComponet comp; // ,
      Privateboo isDisposed = false; //

      PublicBaseResource
      {
      }

       //
       // , ,
       Public void Dispose()
       {
           Dispose(true);//

          // ,
         // , ,

            GC.SuppressFinalize(this);
         }

         // ,

       ~BaseResource()
        {
           Dispose(false);//
        }

     // true ,
    // false ,
   // , ,
  // , ,
    Protectedvirtual void Dispose(bool disposing)
    {
       If(!this.disposed)//
         {
            If(disposing)
            {
               Comp.Dispose();//
             }

           closeHandle(handle);//
           handle= IntPtr.Zero;
           }
          this.disposed= true; //
      }
  }

좋은 웹페이지 즐겨찾기