|
wGarbage collection이 일어나면 먼저 0세대에 해당하는 개체들을 제거한다. 살아남은 개체들은 1세대로 바꾼다. 0세대 개체가 모두 제거한 뒤에도 메모리가 부족하면 1세대 개체를 제거한다. 그 다음에도 부족하면 2세대로 넘어간다. |
System.GC Class member
이름 |
설명 |
MaxGeneration |
이 속성은 대상 시스템에서 지원하는 가장 큰 세대를 반환한다. |
Collect() |
GC가 관리 힙에 있는 모든 객체에 대해서 Finalize()를 호출하게 한다.(원한다면) 검색할 세대를 지정할 수 있다. |
GetGeneration() |
현재 개체가 속한 세대를 반환한다. |
GetTotalMemory() |
현재 힙에 있는 모든 개체들에 의해서 사용되고 있는 메모리와 곧 제거될 객체들의 추산된 합을 반환한다. 이 메소드에는 Boolean매개 변수가 있는데, 이 매개변수는 이 메소드 호출시 가비지 컬렉션이 발생할지 아닐지를 지정하는 데 이용된다. |
ReRegisterForFinalize() |
개체가 다시 Finalizeble하게 되도록 한다. (이 개체가 전에 SuppressFinalize() 에 의해서 종료되지 않도록 표시되었다는 것을 전제로 한다. |
SuppressFinalize() |
해당 개체의 Finalize()메소드가 호출되지 않게 한다. |
소멸자
소멸자는 compile이 되면 Finalize()로 변환된다.
Finalize()는 명시적으로 호출할 수 없기 때문에 소멸자를 사용해야 한다.
내부적으로 소멸자는 다음과 같이 변환이 된다. 즉, 파생된 인스턴스의 경우 상속 체인에 있는 모든 base클래스의 Fiinalize가 호출 된다.
protected override void Finalize() { try { //소멸자에 구현한 코드 } finally { base.Finallize(); } } |
IDisposable interface와 Dispose()
wGC는 관리되는 개체가 더 이상 사용되지 않을 경우 해당 개체에 할당된 리소스를 자동으로 해제하지만 garbage collection이 언제 발생할 지 예측할 수 없다.
wDispose() 코드내에서 리소스를 해제하도록 명시하는 방법
w개체가 더 이상 사용되지 않는 시점에 바로 리소스가 해제됨
wDispose()는 해당 개체의 GC.SusppressFinalize 메소드를 호출해야 한다.
-GC가 자동으로 호출하는 Finalize()는 리소스를 많이 소모하기 때문에 Dispose()를 통해 개체가 이미 정리된 경우라면 GC에서 개체의 Finalize 메소드를 호출할 필요가 없다.
예제)
using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace DisposeTest { class Program { static void Main(string[] args) { using(Man man = new Man()) //using의 범위제한 기능 { Console.WriteLine("using을 통해 개체를 생성하면 using블럭안에서만 개체를 사용 할 수 있다.\n"); } Console.WriteLine("블럭을 벗어나면 Dispose가 호출 되어 개체가 소멸된다.\n"); } }
class Man : IDisposable //IDisposable 인터페이스 { public void Dispose() { Console.WriteLine("Dispose!!!\n"); GC.SuppressFinalize(this); } } }
|
결과화면