2009-11-27 5 views
0

나는 두 객체가 있다고 가정.NET 가비지 컬렉션 (Garbage Collection)

오브젝트 1을, object2

나는 다음과 같은 할당을 수행 할 때 :

object2.Foo = object1.Foo; //Edit: where Foo is a reference type 

가비지 컬렉터가 할 무엇을 :

  1. object2.Foo에 할당 된 값을 유지하면서 object1을 수집합니까?
  2. 또는 object2Foo가 object1.Foo를 참조하기 때문에 object2가 수집 될 때까지 object1이 지속됩니까?
  3. 가비지 수집은 완전히 다른 것을 수행합니까? 그렇다면 설명해주십시오.

고마워요!

+0

'Foo'는 객체 또는 값 유형입니까? –

+1

거짓으로 시작하기 때문에 질문이 혼란 스럽습니다. "두 개체가 있다고 가정 해보십시오." 좋아, 두 개의 대상은 무엇입니까? object1에 의해 참조 된 객체, object2에 의해 참조 된 객체, object1.Foo에 의해 참조 된 객체 및 object2.Foo에 의해 참조 된 객체의 네 가지 객체가 있음을 알 수 있습니다. 두 개의 물체, 또는 네 개의 물체가 있습니까? –

답변

6

코드

object2.Foo = object1.Foo; 

object1object2의 상태에 영향을주지 않습니다. object2.Foo의 이전 값에 영향을 미칠 수 있습니다. 다른 참조가없는 경우 object2.Foo에 의해 참조 된 객체를 수집 할 수 있습니다.

1

결국 개체에 대한 참조가 더 이상 없으면 개체 1을 수집합니다. Foo는 object1에 묶여 있지 않습니다. Foo가 참조 객체이면 힙에 저장되고 object1은 Foo에 대한 포인터를 저장하는 것입니다. Foo가 값 유형이면 object2에 할당 할 때 사본이 작성되고 object1의 Foo는 object1과 함께 소멸됩니다.

개체에 대한 참조가 더 이상 존재하지 않는 시점에서 개체가 파괴됩니다. 클래스가 수집 될 때 클래스에서 참조 된 객체가 파괴되는 유일한 경우는 클래스가 특정 참조에 대한 유일한 포인터 일 때입니다.

아래 그림에서 일부 개체는 상당히 오래되었지만 여전히 참조되어 있으므로 수집되지 않습니다. 새로 생성 된 객체는 더 이상 참조되지 않기 때문에 GC'ed됩니다.

alt text http://chaoticjava.com/wp-content/uploads/2008/05/gc.png

+1

이것은 만화가 묘사하는 세대 별 쓰레기 수거에 대한 정확한 설명이 아닙니다. 세대 별 가비지 컬렉터는 몇 가지 수집 과정에서 생존 한 객체 (일반적으로 단 한 번만 통과 한 객체)를 표시하여 수집하는 데 많은 시간을 낭비하지 않도록합니다. 대부분의 가비지는 항상 할당되고 한 번 사용되며 더 이상 필요하지 않은 개체이므로 하나의 컬렉션보다 오래 지속되는 개체는 수집 할 가능성이 거의 없습니다. 가비지 컬렉터는 가끔씩 새로운 객체처럼 빈번하게 수집 가능성을 위해 오래된 객체를 검사합니다. – SingleNegationElimination

0

Foo에 대한 참조가 추가되었습니다. 이것은 object1과 전혀 관련이 없습니다. object1에 대한 참조가 모두 범위를 벗어나면 object1이 수집됩니다. Foo은 완전히 별도로 수집됩니다.

편집 : 물론 foo은 참조 유형이라고 가정합니다.

0

Object2.FooObject1.Foo은 동일한 개체, 즉 원래 Object1.Foo이 가리키는 개체를 참조합니다. 이전에 Object2.Foo에 의해 참조 된 개체는 다음에 실행될 때 가비지 수집기에서 수집됩니다 (이것은 Foo의 유형이 클래스가 아니라 구조체라고 가정 함).(참조가 왼쪽에서 오른쪽으로있는 곳)

3

Foo를 백업 저장소로 필드 또는 속성이되는 가정이 비슷하게 객체의 그래프를해야합니다 :

object2에 대한 마지막 참조가 간다
 object1 
    /  \ 
root   foo 
    \  /
    object2 

경우 범위를 벗어난 다음이있다 : 루트에서 객체의 그래프에서 도달 할 수없는

 object1 
    /  \ 
root   foo 
      /
    object2 

아무것도, 그래서 object2가 수집 될 수 가비지 컬렉션을위한 공정한 게임이다. 그러나 foo은 여전히 ​​object1을 통해 접근 할 수 있으므로 수집되지 않습니다.

+1

"공정한 게임"은 수집 가능한 쓰레기의 전문 용어입니까? 그것은해야한다! – SingleNegationElimination

+0

정확하지만 "if ... object2가 범위를 벗어난 경우"는 질문에 없습니다. –

+0

네, 맞아요. 내 아스키 아트로 도취 당했다.) – GraemeF

0

object1.foo가 객체 (null 값이 아님)를 사용하는 경우, 다른 객체 (object3.foo?)가 동일한 객체를 사용하지 않으면 가비지 수집을 위해있을 것입니다. .