C\#쓰레기 회수 메커니즘 에 대한 간단 한 설명
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())
{
     //
}
MSDN 의 정 의 는 대상 이'쓰레기 수 거'를 회수 하기 전에 자원 을 방출 하고 다른 청소 작업 을 수행 하도록 허용 하 는 것 이다.그것 의 본질은 바로 분석 함수 이다.
class Car
{
    ~Car()  // destructor
    {
        // cleanup statements...
    }
}
protected override void Finalize()
{
    try
    {
        // Cleanup statements...
    }
    finally
    {
        base.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; //         
      }
  }
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
PHP 쓰레기 수 거 메커니즘 설명이렇게 긴 이 야 기 를 하면 서 간단 한 사례 를 통 해 두 가지 요점 을 설명 했다.인용 계수 와 쓸 때 복사 하면 쓰레기 회수 도 와 야 한다.zval 이 unset 에 의 해 실 행 될 때,또는 한 함수 에서...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.