2017-11-07 8 views
0

최근에 메모리 누수가 발생하는 asp.net 프로젝트를 상속했습니다. 내 조사에서 IDisposable을 구현하는 많은 맞춤 클래스가 있음을 알았지 만 호출 할 때 "사용"하지 않습니다. 이 문제를 해결했지만 정적 인 메서드를 클래스에 넣는 것이 궁금했던 사용 사례가 하나 있습니다. 이런 식으로 뭔가 :이 완료 같은개체를 상속하는 정적 메서드 Disposable

public class ImDisposable : IDisposable{ 
    public static GetList(string search){ 
     //doStuff 
    } 
    //implement IDisposable 
} 

public class UseDisposable{ 
    public void GetList(string search){ 
     var list = ImDisposable.GetList(search); 
     //do stuff 
    } 
} 

난 아무것도 본 적이 없어, 난 GC가이 시나리오를 처리하는 방법을 궁금했다. 감사.

답변

1

정적 메서드는 특정 인스턴스에 의존하지 않으므로 관리되지 않는 리소스를 묶을 수있는 클래스의 인스턴스 멤버에 액세스 할 수 없어야합니다. 관련 메모에서 자원


를 폐기에 대해 생각 할 때

당신이 그들을 고려하지 않아도, 방법의 존재는 중 하나는 IDisposable과 거의가 있습니다. 그것은 클래스의 인스턴스가 사용할 수있는 관리되지 않는 리소스를 삭제합니다. (예 : 열린 파일 스트림)

0

귀하의 질문은 약간 모호합니다.

가비지 수집에 대한 설명은 Richter가 C#을 통해 책 CLR을 볼 수 있습니다. 제 느낌은 당신의 질문이 정적이 아닌 클래스의 정적 메소드와 가비지 컬렉터 사이의 상호 작용에 관한 것입니다. 위의 책은 그것도 다룹니다. 일반적으로 리소스를 할당하는 정적 메서드는 리소스를 할당하는 비 정적 메서드와 비슷한 방식으로 동작합니다. 그러나 IDisposable 인터페이스는 클래스의 인스턴스에서 작동합니다. 따라서 정적 GetList (..) 메서드는 IDisposable 구현을 해제해야하는 리소스를 사용하지 않아야합니다.

1

Dispose()을 호출하지 않는다고해서 메모리 누수와 가비지 수집을 혼동한다고해서 누출이있는 것은 아닙니다. 다음 경우에 누수가 발생합니다.

(1) 처분하지 않은 클래스에는 관리되지 않는 리소스에 대한 핸들이 있습니다. 파일 스트림. 이론적으로 클래스가 IDisposable을 구현하는 경우 관리되지 않는 리소스가 있지만 빈 공간을 처리하는 방법을 충분히 보았습니다. I.E. 정적 클래스/멤버의 경우, 정적 변수가 없으면 메모리 누수가 발생하지 않습니다.

또한 정적 멤버는 인스턴스화하는 클래스 수에 관계없이 인스턴스를 하나만 가지며 새 인스턴스를 만들지 않으면 실제로 누수가 발생할 수 없습니다.

(2) 좋은 예제는 이벤트 리스너, 특히 람다로 연결된 사람들입니다. Dispose()는 연결 풀에 연결을 반환하기 만해도 데이터베이스 연결에서 Dispose()를 호출하지 않으면 누수로 간주됩니다.

증가하는 메모리 사용 공간이 반드시 누출되는 것은 아닙니다. 가비지 콜렉션은 .NET 런타임이 필요하다고 판단 할 때만 수행됩니다 ... 여전히 많은 메모리가 사용 가능하다면 GC가 필요 없습니다.

간략한 개요; 나는 대부분이 메모리 누수와 관련이 없다고 말하고 있습니다.메모리 누출을 줄이는 좋은 기사가 있습니다 here