[단지 내부 마무리 과정에 추가하고 싶었습니다]
따라서 개체를 만들고 개체를 수집 할 때 개체의 Finalize
메서드를 호출해야합니다. 그러나이 간단한 가정보다 마무리에 더 많은 것이 있습니다.
짧은 개념 ::
Finalize
메소드를 구현하지 않는 객체 , 메모리는 즉시 회수됩니다. 물론
응용 프로그램 코드로 더 이상 도달 할 수 없다면
Finalize
방법, 개념 / 구현을 구현하는 객체 Application Roots
,Finalization Queue
, Freacheable Queue
가 재생되기 전에 온다.
응용 프로그램 코드로 접근 할 수없는 객체는 쓰레기로 간주됩니다
가정 :: 클래스 / 객체 A, B, D, G, H는 구현하지 않습니다 Finalize
Method를 않으며 C, E, F, I, J는 Finalize
Method를 구현 합니다.
응용 프로그램이 새 객체를 만들면 new 연산자는 힙에서 메모리를 할당합니다. 객체의 유형에 Finalize
메서드 가 포함되어 있으면 객체에 대한 포인터가 종료 큐에 배치됩니다 .
따라서 객체 C, E, F, I, J에 대한 포인터가 종료 큐에 추가됩니다. 마무리 큐 가비지 컬렉터에 의해 제어되는 내부 데이터 구조이다. 대기열의 각 항목 은 객체의 메모리를 회수하기 전에 해당 메소드를 호출 해야하는 객체를 가리 킵니다 . 아래 그림은 여러 객체가 포함 된 힙을 보여줍니다. 이러한 객체 중 일부는 응용 프로그램의 루트 에서 접근 할 수 있습니다
Finalize
일부는 그렇지 않습니다. 개체 C, E, F, I 및 J가 만들어지면 .Net 프레임 워크는 이러한 개체에 Finalize
메서드가 있고 해당 개체에 대한 포인터가 최종 큐에 추가 되었음을 감지합니다 .
GC가 발생하면 (1 차 수집) 객체 B, E, G, H, I 및 J는 가비지 인 것으로 결정됩니다. A, C, D, F는 위의 노란색 상자에서 화살표로 표시된 응용 프로그램 코드에 의해 여전히 도달 가능합니다.
가비지 콜렉터는 종료 큐를 스캔하여 이러한 오브젝트에 대한 포인터를 찾습니다. 포인터가 발견되면 포인터가 종료 큐에서 제거되고 연결 가능 큐에 추가됩니다 ( "F-reachable"). F- 접근 큐 가비지 컬렉터에 의해 제어되는 다른 내부 데이터 구조이다. 연결 가능 큐의 각 포인터는 해당 큐 를 가질 준비가 된 오브젝트를 식별합니다.
Finalize
메소드를 호출 .
수집 (1 차 수집) 후 관리되는 힙은 아래 그림과 유사합니다. 아래에 주어진 설명 :
1.) 객체 B, G 및 H가 차지한 메모리는 이들 객체에 호출해야 할 finalize 메소드가 없기 때문에 즉시 회수되었습니다 .
2.) 그러나, 메모리는 때문에 E, I 및 J는 재사용 할 수없는 객체에 의해 점유 된 Finalize
방법은 아직 호출되지 않았습니다. Frequeable 대기열에
의해 Finalize 메서드 호출이 수행 됩니다.
3.) A, C, D, F는 위의 노란색 상자에서 화살표로 표시된 응용 프로그램 코드에 의해 여전히 도달 가능하므로 어떤 경우에도 수집되지 않습니다.
Finalize 메서드 호출 전용의 특수 런타임 스레드가 있습니다. 연결 가능 큐가 비어있는 경우 (보통 경우)이 스레드는 휴면 상태입니다. 그러나 항목이 나타나면이 스레드는 깨어나 대기열에서 각 항목을 제거하고 각 개체의 Finalize 메서드를 호출합니다. 가비지 콜렉터는 교정 가능 메모리를 압축하고 특수 런타임 스레드는 각 오브젝트의 메소드를 실행 하여 도달 가능 큐를 비 웁니다 Finalize
. 마지막으로 Finalize 메서드가 실행될 때입니다.
다음에 가비지 콜렉터가 호출되면 (2 차 콜렉션), 애플리케이션의 루트가이를 가리 키지 않고 도달 할 수있는 큐 가 더 이상이를 가리 키지 않기 때문에 최종 오브젝트 (실제로 가비지 가 있음)를 볼 수 있습니다. 객체 (E, I, J)의 메모리는 힙에서 간단히 재생됩니다. 아래 그림을 참조하여 바로 위의 그림과 비교하십시오.
여기서 이해해야 할 중요한 점 은 최종화가 필요한 객체가 사용하는 메모리를 재생하려면 두 개의 GC가 필요하다는 것 입니다. 실제로, 이러한 개체는 이전 세대로 승격 될 수 있으므로 두 개 이상의 컬렉션 캡이 필요합니다.
참고 : F- 접근 큐는 전역 및 정적 변수 뿌리 단지 같은 루트로 간주됩니다. 따라서 오브젝트가 도달 가능한 큐에 있으면 오브젝트에 도달 할 수 있으며 가비지가 아닙니다.
마지막으로, 응용 프로그램 디버깅은 한 가지, 가비지 수집은 다른 것이며 다르게 작동한다는 것을 기억하십시오. 지금까지는 응용 프로그램을 디버깅하는 것만으로 가비지 수집을 감당할 수 없으며 메모리를 조사하려는 경우 여기에서 시작하십시오.