2012-03-20 5 views
1

GC에 대해 읽었으며 GC가 2 개가 작동하는 한 가지 방법이 없다는 것을 깨달았습니까?세대 별 가비지 수집과 .NET의 가비지 수집

  1. 는 F- 접근 큐
  2. 를 호출에있는 모든 객체의 finalize 메소드에 무료로
  3. 개체를 수집 응용 프로그램 루트를 사용하여 쓰레기 물체를 감지 :

    먼저 일반 GC입니다 freachable queue

  4. 다음 GC 라운드에서 모든 최종 개체를 지 웁니다.

    1. (그들에게 덜 번 스캔) 2 세대로 살아남은 사람을 통과 확보하고 그들에게
    2. 를 지울 개체를 스캔하여 물체를 감지
    3. :

    두 번째 세대 GC입니다

  5. 세대 3.

에 가장 살아 객체를 전달 나는 완전히 혼란 스러워요 : GC의 두 가지 다른 유형입니까? 아니면 세대 별 GC가 첫 번째 업그레이드와 비슷합니까? 아니면 똑같습니까?

.NET의 작동 방식은 무엇입니까?

+0

이 우수한 책에서는이 내용을 매우 명확하게 설명합니다. http://www.microsoft.com/learning/en/us/book.aspx?id=6522 – remio

+3

모든 컬렉션은 세대별로 동일합니다. 두 시나리오의 유일한 차이는 finalizer가있는 클래스의 동작입니다. –

답변

1

.NET은 사용자가 설명한 것처럼 거의 세대가 다릅니다. "Something"은 GC 패스를 트리거합니다. 이 패스의 생존자는 2 세대 (Gen 0에서 시작하여 총 2 개의 프로모션)까지 차세대로 진행됩니다.

세대별로 더 높은 GC 통과는 더 비쌉니다. 당신이 설명한 것을

http://dotnetfacts.blogspot.co.uk/2008/05/how-garbage-collector-works-part-1.html

http://dotnetfacts.blogspot.co.uk/2008/05/how-garbage-collector-works-part-2.html

가 두 부분으로 나타납니다

이 블로그 (그리고 그물에 많은 다른 소스) .NET에서 GC의 좋은 개요를 제공합니다 .NET 이야기. 파이널 라이저와 내부 대기열 (freachable)에 대한 개요가 대부분 정확한지 (잘 모름) 믿기는하지만 생성 동작도 마찬가지입니다.

이 SO 질문은 비슷한 해역에서의 발가락을 딥 : 소멸자/파이널 라이저는 클래스 내에서 구현 될 때

Garbage Collection in .Net implementaion, objects behavior is unknown, unable to understand their behavior

1

첫 번째 포인트가 적용됩니다. 그것의 엔트리는 객체를 초기화 할 때 finalization 큐에 추가 될 것입니다. 이 객체가 finalization/fReachable 대기열 (둘 다 GC 루트로 작동)과 별도로 GC 루트 (예 : 스택 참조, 정적 객체 참조, CPU 레지스터 ...)에 의해 참조되지 않으면이 항목은 fReachable 대기열로 이동됩니다. 이 큐는,이 오브젝트의 finalize 메소드를 호출하는 개별 thread에 의해 감시됩니다.

다음 링크는 .NET 환경에서 메모리 관리를 이해하는 데 필요한 참고 자료입니다.처음 두 장 (약 40 페이지)은 .NET 환경에서 가비지 콜렉션이 작동하는 방식에 대한 우수하고 깊은 아이디어를 제공합니다. 무엇보다도 그것은 무료 eBook입니다. 크리스 파렐과 닉 해리슨

Direct Link

으로

Under the Hood of .NET Memory Management 나는 .NET 기술을 사용하여 효율적으로 프로그램을 작성 할 모든 .NET의 사람에게이 책을 추천한다.