2011-09-02 5 views
3

내가 가지고있는 다음과 같은 방법으로 다음과 같은 클래스 : 바 클래스는 위의 코드를 사용하여 과정 푸를 만드는 경우정적 방법 메모리 소비

public class Foo 
{ 
    public string A {get;set;} 

    public static Foo New(string a) 
    { 
     Foo newFoo = new Foo(); 
     newFoo.A = a; 
     return newFoo; 
    } 
} 

public class Bar 
{ 
    public void SomeMethod() 
    { 
     ... 
     Foo anotherFoo = Foo.New("a"); 
     .... 
    } 
} 

는 푸 적 범위를 나가서 쓰레기 수집을 얻거나 것이다 것 Foo (정적 메서드를 사용하기 때문에) newFoo 변수에 대한 참조가 계속되므로 anotherFoo는 절대 범위를 벗어나지 않습니다.

답변

5

정적 메서드가 있으면 개체의 GC 적합성에 영향을주지 않으며 해당 개체에 대한 참조 만 영향을줍니다. 귀하의 경우에는 anotherFoo만이 참고가 될 것입니다. 참조 newFoo은 메서드가 반환 될 때 범위를 벗어나 스택에서 벗어납니다.

정적 메서드 내부의 로컬 변수 자체가 "정적"이 아니므로 메서드가 반환 될 때 정적이 아닌 메서드와 마찬가지로 실행 스택에서 해당 로컬이 팝됩니다.

anotherFoo 뒤에 기본 목적은 SomeMethod 반환 (물론, 컴파일러가 더 공격적이고 anotherFoo이 코드에서 더 이상 사용되지 때 GC-수있게 만들 수 있습니다) 때 GC 대상이 될 것입니다.

4

aFoo.New()이 완료되는 즉시 범위가됩니다. newFoo에 대한 참조가 반환되고 newFoo이 범위를 벗어납니다. SomeMethod은 아직 anotherFoo 참조를 통해 해당 인스턴스에 대한 참조를 가지고 있으므로 참조가 저장되지 않는 한 SomeMethod이 완료 될 때까지 가비지 수집에 대한 참조를 사용할 수 없습니다.

1

클래스가 결코 "범위를 벗어납니다". 인스턴스 (참조)가 수행합니다. newFoo 레퍼런스는 SomeMethod 메소드가 끝날 때 anotherFoo와 같이 메소드 New가 끝나면 범위를 벗어난다.

메서드가 정적이라는 사실은 아무 것도 바뀌지 않습니다. 실제로 정적 변수는 "고 빈도 힙"이라는 별도의 힙에서 생성되기 때문에 아무 것도 변경하지 않는 Foo의 정적 변수도 있습니다. GC는 분명히 어떤 것도 수집하지 않습니다.

관련 문제