정적 메서드에 대한 참조를 전달한다는 것은 개체가 어떤 식 으로든 루팅된다는 것을 의미하지 않으므로 개체가 수집되지 못하도록하는 것만으로는 충분하지 않습니다.
메서드 호출 중에 수집 할 수 있는지 여부는 인수를 사용하여 수행하는 작업과 메서드 호출 외부에서 개체가 사용 중인지 여부에 따라 달라집니다.
예를 들어,이 가상의 코드를 고려해이 경우
public static class Program()
{
public static void Main()
{
SomeObject o = new SomeObject();
OtherMethod(o);
}
private static void OtherMethod(SomeObject x)
{
// lots of code here, but none that uses x
}
}
를, O는 OtherMethod
에 통화 중에 수집 할 수 컴파일하고 릴리스 빌드를 실행 제공. 릴리스 빌드의 경우, 더 이상 사용되지 않는 변수 및 매개 변수는 사용하지 않는 것으로 간주되어 죽은 것으로 간주되므로 더 이상 객체에 대한 라이브 참조가 있는지 확인할 때 계산되지 않습니다.
디버그 빌드에서는 메서드를 반환 할 때까지 모든 변수와 매개 변수가 인위적으로 유지되므로 브레이크 포인트를 설정하고 변수를 검사 할 수 있습니다. 코드를 사용하는 코드가 남아 있지는 않더라도 변수를 검사 할 수 있습니다.
디버그 빌드에서 위의 코드를 실행하면 Main이 반환 될 때까지 객체가 활성 상태로 유지됩니다.
수정 - 인스턴스 변수를 정적 필드에 할당하거나 참조를 하나의 필드에 저장하지 않는 한 수정하십시오. – saret