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())
{
//
}
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; //
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
PHP 쓰레기 수 거 메커니즘 설명이렇게 긴 이 야 기 를 하면 서 간단 한 사례 를 통 해 두 가지 요점 을 설명 했다.인용 계수 와 쓸 때 복사 하면 쓰레기 회수 도 와 야 한다.zval 이 unset 에 의 해 실 행 될 때,또는 한 함수 에서...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.