2013-12-19 6 views
3

이 여전히 존재 ObjectD 더 이상 필요하지 않은 어떤 점하지만 someObject의 인스턴스에 다음 개체효율적인 가비지 컬렉션

class someObject; 
{ 
    public objectA A{get;set;} 
    public objectB B{get;set;} 
    public objectC C{get;set;} 
    public objectD D{get;set;} 
    //... 
} 

을 고려하고 몇 시간 동안 그렇게 할 것입니다, objectD는 역할 후에 그래서 기억을 많이 차지 나는 널 (null)로 설정했다.

  • 는 내가 그것을 null로 설정 즉시 으로 메모리가 ObjectD에서 해방 얻을 것이다 의미합니까?
  • 개체가 너무 오랫동안 사용되지 않고 일부 범위에서 사용되지 않는 경우 .NET에서 수행하는 작업은 입니까?

답변

6

는 내가 그것을 null로 설정으로 메모리가 즉시 ObjectD에서 해방 얻을 것이다 의미합니까?

null에 세트를 반대하지 것 - 그것의 참조가 null에 메모리 세트에 이의를 제기. 가비지 콜렉터가 수집 할 때까지 오브젝트가 존재합니다 (이 오브젝트에 대한 다른 참조가없는 경우).

더 이상 참조되지 않은 항목을 수집합니다 Fundamentals of Garbage Collection

+0

가비지 수집기는 더 이상 참조가 없을 때 수집합니까? GC가 어떤 객체에 대해 정적으로 동작하도록 만드는 방법이 있습니까? – FPGA

+3

가비지 컬렉터의 습관은 실제로 선택한 빌드 구성에 따라 다릅니다. 릴리스 빌드가 사용되지 않는 객체를 제거하는 데 훨씬 더 적극적입니다. – Liath

+1

@ user1492051 수동으로 가비지 수집을 실행할 수 있지만 꽤 비싸고 응용 프로그램의 모든 가비지 객체에 영향을줍니다. –

1

GC의에 한 번보세요. 그럴 때까지는 그렇습니다.

예 : 예, ObjectD에 대한 참조를 null로 설정하면 GC가이를 수집 할 수 있습니다. 아니, 곧 일어나는 일은 아닙니다.

1

개체를 null로 설정하고 Collect 메서드 Gc.Collect()을 설정할 수 있습니다. 모든 세대의 가비지 수집을 차단합니다. 모든 객체는 메모리에 저장된 시간과 관계없이 수집 대상으로 간주됩니다.

+2

가비지 수집을 직접 경고합니다. 2 세대 및 3 세대 객체는 더 많은 시간과 노력을 요구할 수 있습니다. 추가 컬렉션을 강제로 수행 할 수 있습니다 (일부 리소스는 무료로 제공 할 수 있음). 이후 세대에 아이템을 강제 할 가능성이 훨씬 높습니다. 공연. – Liath

1

D를 null로 설정하면 GC를 호출 할 때 메모리에서 삭제할 수 있습니다. 그러나 객체에 null 필드가있는 것은 좋은 해결책이 아닙니다. 임시 변수가 필요한 경우 지역 변수 여야합니다.

1
if an object sets for so long unused in some scope what does .NET do about it? 

는 가비지 컬렉터가 수집과 이용에 대한 참조가 모든 참조가 그것에 대한 모든 참조는 다른 출신 다른 널 (null)로 설정하거나하는 중있을 때이다 더 이상 사용할 수있는 개체를 파괴 메모리를 회수하려면 수집 할 수있는 객체. 컬렉션 프로세스에는 사용 가능한 개체를 메모리로 이동하고 더 이상 사용되지 않는 개체가 사용하는 메모리를 회수하는 작업이 포함됩니다. 컬렉션에서 존속하는 객체는 자동으로 차세대로 승격됩니다.

1
  1. 메모리를 NULL로 설정하면 즉시 해제되지 않습니다. 메모리가 가비지 콜렉션으로 표시됩니다. .Net GC 체계는 다소 효율적입니다. 걱정되는 경우 GC 사이클을 강제 실행할 수 있습니다. See this stack overflow article on the yin/yang of this.

  2. 사용하지 않는 것으로 설정하면 .Net이 아무 것도하지 않습니다. 즉, 참조를 명확하게 "무효화"하지 않으면 .Net은 어떤 시점에서 개체가 (즉각적으로) 필요하지 않을 것이라고 기대할 이유가 없습니다. 필요한 경우 .NET에서 "일시적으로 메모리에서 제거"하면 클래스의 상태에 대한 정보를 사용하여 어떻게 든 다시 작성해야합니다 ... 복원 정보에 대한 확실한 선택은 클래스 자체입니다.따라서 제거하는 것은 실제로 선택 사항이 아닙니다. 사용 된 가장 최근의 데이터/프로그램 칩 메모리 캐시 (들)에 대한 지역 (1) 저장 메모리 : 느린하지만-더 큰 메모리 액세스의 다양한 단계를 통해 오프로드

는 일반적으로 최신 컴퓨터에서 사용되는 전략이다 . (2) 오프 칩 메모리 칩에 메모리를 저장하십시오. (3) 가상화 된 미디어 (예 : 하드 드라이브)에 메모리를 저장합니다.

하루가 끝나면 참조를 무효화 할 때 가장 잘 알 것이며 프레임 워크는 언제 개체에 대한 메모리를 저장할시기/장소를 가장 잘 알고 있습니다. GC 메커니즘이 딸꾹질을 일으킬 수있는 게임 프로그래밍 같은 예외가 있습니다. 그러나 일반적으로 시스템은 당신이하는 한 잘합니다.

이 정보가 도움이 되었습니까?