2009-04-21 9 views
21

평범한 용어로 가비지 수집 메커니즘은 어떻게 작동합니까?가비지 수집 메커니즘은 어떻게 작동합니까?

개체가 가비지 수집에 사용할 수있는 것으로 식별되는 방법은 무엇입니까?

또한 GC 알고리즘에서 Reference Counting, Mark and Sweep, Copying, Train은 무엇을 의미합니까?

+4

Nopes ... 아닙니다. 아마도 내가 그런 식으로 표현한 것처럼 보일 것입니다. 어떤 방법 으로든 –

+1

Paul R. Wilson (1992)의 34 페이지 그림으로 된 종이를 읽는 것이 좋습니다. [* Uniprocessor Garbage Collection Techniques *, (http://www.cse.nd.edu/~dthain /courses/cse40243/spring2006/gc-survey.pdf), 기본적인 가비지 수집 기술 (참조 카운팅, 마크 앤 스위프, 마크 컴팩트, 증분, 세대 별)의 개념을 설명합니다. – stakx

답변

29

가비지 수집과 함께 언어를 사용하면 메모리에 직접 액세스 할 필요가 없습니다. 오히려 그 데이터 위에 추상화에 대한 액세스 권한이 부여됩니다. 제대로 추상화 된 것 중 하나는 데이터 블록의 메모리에있는 실제 위치와 다른 데이터 블록에 대한 포인터입니다. 가비지 컬렉터가 실행될 때 (때때로 발생합니다), 할당 된 메모리 블록 각각에 대한 참조를 아직 보유하고 있는지 확인합니다. 그렇지 않으면 그 기억을 풀 것입니다.

다른 유형의 가비지 수집기 간의 가장 큰 차이점은 효율성 및 처리 할 수있는 할당 스키마의 종류에 대한 제한 사항입니다.

가장 간단한 방법은 적절한 참조 계산입니다. 적으로 개체에 대한 참조를 만들면 해당 개체의 내부 카운터가 증가하고 참조가 가능 해지거나 더 이상 범위에 있지 않으면 이전 대상 개체의 카운터가 감소합니다. 이 카운터가 0에 도달하면 개체는 더 이상 참조되지 않으며 해제 될 수 있습니다.

가비지 수집기를 참조하는 경우 발생하는 문제는 순환 데이터를 처리 할 수 ​​없다는 것입니다. 객체 A에 객체 B에 대한 참조가 있고 객체 A에 대한 (직접 또는 간접) 참조가있는 경우 체인의 객체가 체인 외부에서 참조되지 않아도 객체를 해제 할 수 없습니다 (따라서 객체 ' t 프로그램에 전혀 액세스 할 수 없음).

반면에 마크 및 스윕 알고리즘 을 처리 할 수 ​​있습니다. 마크 및 스윕 알고리즘은 프로그램 실행을 주기적으로 중지하고 프로그램이 도달 할 수없는 것으로 할당 한 각 항목을 표시합니다. 그런 다음 프로그램은 프로그램에있는 모든 변수를 실행하고 도달 가능한 것으로 표시합니다. 이러한 할당 중 하나에 프로그램의 다른 데이터에 대한 참조가 포함되어 있으면 해당 데이터도 마찬가지로 도달 가능으로 표시됩니다.

이것은 알고리즘의 일부입니다. 이 시점에서 모든 프로그램이 아무리 간접적으로 액세스 할 수 있다고 표시되어 프로그램에 도달 할 수없는 모든 항목에 도달 할 수없는 것으로 표시됩니다. 이제 가비지 수집기는 도달 할 수없는 것으로 표시된 객체와 관련된 메모리를 안전하게 다시 확보 할 수 있습니다.

마크 및 스윕 알고리즘의 문제점은 효율적이지 않다는 것입니다. 실행하기 위해 전체 프로그램을 중지해야하고 많은 오브젝트 참조가 변경되지 않습니다.

이를 개선하기 위해 마크 및 스윕 알고리즘을 "세대 별 가비지 수집"으로 확장 할 수 있습니다. 이 모드에서는 일부 가비지 수집을 위해 시스템에 있던 객체가 이전 세대로 승격되며 이는 자주 확인되지 않습니다.

개체가 젊어서 (루프 내에서 문자열이 변경되어 수명이 수 백 사이클이 될 것으로 생각하는 등) 개체의 수명이 매우 길거나 응용 프로그램 또는 서블릿의 데이터베이스 연결).

훨씬 더 자세한 정보는 위키피디아에서 찾을 수 있습니다.

의견에 따라

추가 :

마크와

및 알고리즘 (물론 참조 카운트를 제외한 다른 가비지 컬렉션 알고리즘) 가비지 콜렉션을 청소하기 때문에, 프로그램의 맥락에서 하지 실행을 프로그램이 직접 액세스 할 수없는 항목에 액세스 할 수 있어야합니다. 따라서 가비지 컬렉터가 스택에서 실행된다고 말하는 것이 맞지 않습니다.

+3

명확하고 쉽고 간단합니다. 여기서 한 가지 질문은 마크와 스윕에 대해 말했고 프로그램의 모든 변수를 검사합니다. 스택과 힙의 객체에 대한 참조가 잘못되어 있지 않다면 어떻게 그 GC 프로세스를 힙에 연관시킬 수 있습니까? –

3

가비지 수집은 나중에 프로그램에 변수가 필요하다는 것을 아는 것입니다. 그렇지 않으면 수집하고 삭제하십시오.

강조 완전히 쓰레기통에 던져 쓰레기 남자는 당신에게 더 많은 공간을 제공하기 위해 그것을 선택하고 멀리 가져 오는에 의해 당신을 위해 그것을 처리되어 집에서 사용되는 단어 쓰레기, 뭔가에 당신의 집에서 쓰레기 수 있습니다.

참조 카운팅 마크 및 스윕, 복사하는 등 기차 GC FAQ

4
  • 참조 카운팅 좋은 상세히 논의된다 - 각 객체 누군가 참조 소요 때 증가 카운트를 갖는다 개체가되고 누군가가 참조를 해제하면 감소합니다. 참조 횟수가 0이되면 개체가 삭제됩니다. COM은 이 방법을 사용합니다.
  • 마크 및 스윕 - 각 개체에는 사용중인 경우 플래그가 있습니다. 객체 그래프의 루트 (전역 변수, 스택상의 locals 등)에서 시작하여 참조 된 각 객체는 해당 플래그 세트를 얻습니다. 결국 그래프에서 참조되지 않은 모든 오브젝트가 삭제됩니다.

CLR의 가비지 수집기는 slidedeck에 설명되어 있습니다. 슬라이드 15의 "Roots"는 처음 그래프에 들어가는 객체의 소스입니다. 멤버 필드 등은 그래프의 다른 객체를 찾는 데 사용됩니다.

Wikipedia은 이러한 접근 방식 중 몇 가지를 훨씬 더 자세하게 설명합니다.

+0

위키 백과를 훑어 보았습니다. 실제로 나를 괴롭히는 것은 Object Graph가 GC 루틴에 의해 유지되고 트래버스되는 방식입니다. –

+0

개체 그래프 작성에 대한 내 대답이 10k로 업데이트되었습니다. – Michael

0

일반적인 방법으로 개체에 대한 참조 수를 백그라운드에서 추적하고 해당 수가 0이되면 개체가 가비지 수집 대상이되지만 GC가 실행되지 않습니다 값 비싼 조작이기 때문에 명시 적으로 필요할 때까지. 시작될 때 GC는 메모리 관리 영역을 통과하여 참조가없는 모든 객체를 찾습니다. gc는 소멸자를 먼저 호출하여 해당 객체를 삭제하고 이후에 객체를 정리 한 다음 메모리를 해제합니다. 일반적으로 GC는 생존하는 모든 객체를 하나의 메모리 영역으로 이동하여 관리되는 메모리 영역을 압축하므로 더 많은 할당이 수행됩니다.

나는 이것이 내가 아는 하나의 방법이라고 말했고,이 분야에서 많은 연구가 이루어지고 있습니다.

0

Garbage collection은 큰 주제이며 구현 방법은 다양합니다.

간략하게 요약하면 가비지 수집기는 new 연산자를 통해 생성 된 모든 참조에 대한 기록을 유지합니다 (예 : Type.Create() 메서드에서). 개체에 대한 새 참조를 추가 할 때마다 해당 참조의 루트이 결정되고 필요한 경우 목록에 추가됩니다. 참조가 범위를 벗어날 때마다 참조가 제거됩니다.

개체에 대한 참조가 더 이상 없으면 "수집"되지 않습니다. 성능을 향상시키고 필요한 정리 작업이 올바르게 수행되었는지 확인하기 위해 모음을 여러 개체에 대해 일괄 처리하고 여러 세대에 걸쳐 수행합니다.