2009-05-12 7 views

답변

19

관련 변수 AppDomain이 가비지 수집 될 때만 정적 변수에서 참조되는 객체가 가비지 수집됩니다. 클라이언트 응용 프로그램에는 종종 프로세스 기간 동안 만 존재하는 AppDomain이 있습니다. (응용 프로그램이 플러그인 아키텍처를 사용하는 경우는 예외이다 -. 다른 플러그인 다른 AppDomain의로드 할 수 있으며, AppDomain 나중에 언로드 할 수있다) ASP.NET에서

, "AppDomain 재활용은"주기적으로 발생 (여러 가지 이유로) - 이런 일이 발생하면 AppDomain의 정적 변수는 더 이상 GC 루트로 작동하지 않으므로 가비지 수집되는 객체를 방지하지 못합니다.

정적 변수를 통해 개체가 아직 참조되어있는 동안 가비지 수집되는 개체가 걱정된다면 긴장할 수 있습니다. 개체에 액세스 할 수 있으면 가비지 수집되지 않습니다.

+0

이렇게하면 크게 비효율적이지 않습니까? 종종 개인 정적 도우미 메서드를 만듭니다. 또는 모든 확장 방법. 얼마나 많은 기억이 소비되는지 궁금하네요? 개체에 대한 도우미 메서드가있는 경우 도우미를 인스턴스로 두어 개체가 수집되도록하는 것이 좋습니다. –

+0

@ P.Brian.Mackey : 정적 방법이있는 경우 소비되는 메모리는 무엇입니까? 정적 * 변수 *가있는 경우 전역 상태가되어 시작하는 것이 좋지 않은 경우가 많습니다. 그러나 방법 자체는 다른 문제입니다. –

+0

내 실수. 변수처럼 스택/힙에서 메소드를 생성한다고 가정했습니다. 분명히 그렇지 않습니다. –

5

회원은 수집되지 않습니다 ... 개체가 있습니다.
그래서 Ref. 정적 멤버를 null로 입력하면 이전에 가리키고 있던 모든 객체가 수집됩니다. 그렇지 않은 경우 AppDomain이 다운 될 때까지 중단됩니다 (각 AppDomain에는 자체 정적 세트가 있음)

0

참조 유형에 대한 정적 멤버는 참조이며 인스턴스를 가리 키거나 나타내지 않을 수 있습니다. 그것이 인스턴스를 가리키면, 상기 인스턴스는 정적 멤버가 언로드 될 때까지 수집되지 않을 것이다. 유형이 특정 AppDomain에로드되면 언로드 할 수 있습니다. 그렇지 않으면 응용 프로그램이 종료 될 때만 발생합니다.

1

짧은 대답 ... 아니요; .NET 가비지 수집기의 모든 현재 구현은 정적 클래스 멤버 필드의 강력한 참조가 연결된 응용 프로그램 도메인이 해체 될 때까지 정적 클래스 멤버 필드에서 강력하게 참조되는 개체를 수집하지 않습니다.

답변이 더 길면 ... 잠재적으로 예; 가비지 수집기는 객체에 대한 참조 (강하거나 약함)가 아니라 객체의 도달 가능성에 대한 객체를 수집하기로 결정합니다. 이론적으로 가비지 수집기가 코드가 특정 시점 이후에 특정 객체를 다시 요구하지 않는다고 판단 할 수있는 경우 (즉, 객체가 어떤 코드 경로에서도 도달 할 수없는 경우) GC는 해당 객체를 수집 할 수 있습니다 정적 클래스 멤버 필드에서 여전히 강력하게 참조 된 경우 코드는 객체에 대한 참조를 보유하는 정적 클래스 멤버 필드에 액세스하려고 시도하지 않으므로 전혀 알 수 없으므로 완벽하게 허용됩니다. 당신이 물어볼 수도 있습니다. 그렇다면 제가 강하게 유지하고있는 어떤 참조를 통해서도 객체에 다시 접근 할 수 없다면 왜 신경을 씁니까? 당신이 신경을 쓰는 이유는 부작용입니다. 예를 들어 정적 클래스 멤버 필드에 관리되지 않는 리소스를 나타내는 SafeHandle 개체에 대한 참조를 할당하면 SafeHandle 개체가 절대로 닫히지 않아서 해당 개체가 유지 관리되는 "개체"를 유지하게됩니다. 이는 GC의 현재 구현에만 해당됩니다. GC의 향후 구현은 정적 클래스 멤버 필드가 나머지 프로그램 코드에 의해 더 이상 도달 할 수없는 경우 강력하게 참조되는 객체를 수집 할 수 있습니다.