> 백엔드 개발 > C#.Net 튜토리얼 > .Net 가비지 수집 메커니즘 상세 소개

.Net 가비지 수집 메커니즘 상세 소개

高洛峰
풀어 주다: 2016-12-20 14:13:33
원래의
1762명이 탐색했습니다.

소멸자

소멸자는 public과 같은 수식자를 가질 수 없습니다. 어떤 매개변수도 받아들일 수 없습니다.

컴파일러는 다음과 같이 자동으로 소멸자를 Object.Finalize 메서드의 재정의 버전으로 변환합니다.

class Test
{
  protected override void Finalize()
  {
    try {…}
    finally { base.Finalize(); }
  }
}
로그인 후 복사

Garbage Collector

.NET Garbage Collector는 다음을 보장합니다.

l 각 객체가 파괴되고 해당 소멸자가 실행됩니다. 프로그램이 종료되면 모든 객체가 소멸됩니다.
l 각 개체는 한 번만 파괴됩니다.
l 각 객체는 도달할 수 없는 경우(즉, 객체에 대한 참조가 없는 경우)에만 삭제됩니다.

작업 방법:

1) 도달 가능한 모든 객체를 포함하는 맵을 구성합니다. 이를 위해 객체의 참조 필드를 반복적으로 따릅니다. 가비지 수집기는 이 맵을 매우 신중하게 구성하고 순환 참조가 무한히 반복되지 않도록 합니다. 이 지도의 어떤 개체도 접근할 수 없는 것으로 간주되지 않습니다.
2) 도달할 수 없는 객체에 실행해야 할 소멸자가 있는지 확인합니다(소멸자를 실행하는 과정을 종료라고 합니다). 종료가 필요한 도달할 수 없는 객체는 특수 대기열에 배치됩니다. 이 큐를 접근 가능한 큐라고 합니다.
3) 연결할 수 없는 나머지 객체(즉, 종료가 필요하지 않은 객체)를 재활용합니다. 이는 도달 가능한 개체를 힙 아래로 이동하여 힙 조각 모음을 수행하고 힙 상단에 있는 메모리를 해제함으로써 수행됩니다. 가비지 수집기는 연결 가능한 개체를 이동할 때 개체에 대한 참조도 업데이트합니다.
4) 그런 다음 다른 스레드가 실행을 재개할 수 있도록 허용합니다.
5) 별도의 스레드에서 마무리가 필요한 연결할 수 없는 객체(접근 가능한 대기열에 있음)에 대해 마무리 작업을 수행합니다.

위의 요약을 보면 소멸자의 존재로 인해 위의 프로세스가 2단계와 5단계를 더 실행하게 됨을 알 수 있습니다. 따라서 제네릭 대신 using 블록을 사용하는 것을 고려해 보세요. 사용되는 클래스가 Dispose 메서드(Close 메서드)를 구현하는 경우. 이 메소드는 finally에서 호출하는 것이 가장 좋습니다(메소드 호출 전, 폐기할 객체의 Distributed 속성이 false인지 확인하고, true가 아닌 경우에만 dispose해야 합니다. 이것이 사용을 권장하는 이유이기도 합니다. 를 사용하면 소멸될 변수의 범위, 즉 중괄호 쌍 사이를 쉽게 제한할 수 있습니다. 또는 using 블록을 사용하여 이 클래스를 사용하는 코드를 둘러쌉니다. using 블록에 배치된 개체 형식은 IDisposable 인터페이스를 구현해야 합니다.

표준 청소 모드

마지막으로 .NET에서 권장하는 표준 청소 모드 코드가 제공됩니다. 샘플 코드:

class MyClass : IDisposable
{
  private bool disposed = false;//Disposal 状态
 
  public void Dispose()//公有Dispose方法(可选实现IDisposal接口)
  {
    Dispose(true);
    GC.SuppressFinalize(this);
  }
 
  ~MyClass()
  {
    Dispose(false);
  }
 
  protected virtual void Dispose(bool disposing)
  {
    if (!disposed)
    {
      if (disposing)
      {
        //Dispose the managed resources.
      }
      //Dispose the unmanaged resources.
    }
    disposed = true;
  }
}
로그인 후 복사

위 코드에서는 소멸자에서 Dispose 메서드를 호출하여 Dispose가 실행되도록 합니다. , 또한 GC.SuppressFinalize(this);는 컴파일러가 이 객체를 파괴하는 것을 방지하는 데 사용됩니다.

읽어 주셔서 감사합니다. 도움이 되기를 바랍니다. PHP 중국어 웹사이트를 지원해 주셔서 감사합니다!


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿