1

자주 여러 스레드에서 호출되는 정적 메서드가 포함 된 유틸리티 클래스를 개발 중입니다. 나는 메모리 사용이 시간이 지남에 따라 증가하고 있다는 것을 알아 차리고 있는데, 그래서 나는 약간의 메모리 누수가 있다고 생각한다. 문을 '사용'또는 직접 실제로 메모리를 지 웁니다 정적 메서드 내에서 폐기 전화 사용 여부를문/호출 사용 정적 메서드 내부 처리

public static int CreateNewThing(int IDofSomeDBObjectHoldingInfoToCreateNewThing) 
{ 
    using(SomeDBContext context = new SomeDBContext(connectionString)) 
    { 
     SomeDBObjectHoldingInfoToCreateNewThing createNewThingyInfo = context.SomeDBObjectsHoldingInfoToCreateNewThing.First(obj => obj.ID == IDofSomeDBObjectHoldingInfoToCreateNewThing); 
     // Do some stuff to create the new object 
     // Return the ID of the newly created thingy... 
     return theNewThingThatWasCreated.ID; 
    } 
} 

내 질문은 :

여기에 나는이 정적 메소드 사용하고있는 패턴의 간단한 예입니다. 허락하신다면,이 애플리케이션의 전반적인 아키텍처 나 목적은 언급하지 않았지만 여기서도 최고의 패턴을 사용하고 있는지 궁금합니다. .NET에서 스레드로부터 안전한 유틸리티 클래스를 만드는 가장 좋은 방법은 무엇입니까?

+2

"시간이 지남에 따라 메모리 사용량이 증가하고 있습니다."- 반드시 메모리 누수가 있음을 의미하지는 않습니다. 프로파일 러를 사용하여이를 확인 했습니까? 아니면 작업 관리자 만보고 계십니까? –

+0

이것은 Windows 서비스이므로 작업 관리자를보고 있습니다. 언젠가 프로파일 러를 사용하여 오늘 체크 아웃 할 계획이지만, 처음에는 여기가 일반적인 발생인지 혹은 내가 경험하고있는 것인지 확인하기 위해 왔습니다. – pwnyexpress

답변

6

시간이 지남에 따라 메모리 사용량이 증가하고있는 것을 알기 때문에 메모리 누수가있는 것으로 보입니다.

반드시 그렇지는 않습니다. 실제로는 좋은 생각이 들기 위해 더 많은 데이터를 제공해야합니다.

제 질문은 'using'문을 사용하거나 직접 정적 메서드 내에서 Dispose를 호출하면 실제로 메모리를 지우는 것입니다.

using 진술은 메모리 정리에 관한 내용이 아닙니다. 그것이 GC의 일입니다. 그들은 비 메모리 리소스를 공개하려고합니다. 정적 방법이든 아니든간에 SomeDBContext을 처리해야하는지 여부와 완전히 관련이 없습니다. 사용하여 문을 '사용'또는 직접 정적 메소드 내에서 폐기 호출 여부를

+0

내가 물어 봐야 할 것은 'using'을 사용하든, 정적 메서드 내에서 Dispose를 호출 하느냐에 따라 실제로 GC가 객체를 지우는 것입니다. – pwnyexpress

+0

@ hotSauce.Open : 처분과 쓰레기 수거는 * 완전히 분리되어 있습니다 * 그리고 정적 방법에 관계없이 다시 관련이 없습니다. –

+0

문제가되지 않는 한 걱정할 필요가 없지만 .NET의 메모리 관리에 대해 더 교육해야하는 것처럼 들립니다 .-) – pwnyexpress

5

내 질문은 실제로

usingDispose를 호출 단지 syntactially 간단한 방법입니다 메모리를 정리할 수 있습니다. ,

MyClass obj; 
try 
{ 
    obj = new MyClass() 
} 
finally 
{ 
    ((IDisposable)obj).Dispose(); 
} 

다음 Dispose까지 사용 가능한 메모리를 수행합니다

using(MyClass obj = new MyClass()) 
{ 

} 

서면처럼 동일합니다. 아니, 그렇지 않아. Dispose는 가비지 컬렉터와 함께 정리되지 않는 관리되지 않는 리소스를 릴리스하도록 설계되어이 개체의 메모리를 해제합니다. 실제로 개체의 메모리를 더 빨리 릴리스하지는 않습니다. 처리해야 할 공통적 인 사항은 네트워크 연결 (여기서는 그랬듯이) 파일 핸들, 다른 언어와 상호 작용하여 생성 된 관리되지 않는 메모리 등입니다.

따라서 메모리가 왜 올라가고 있습니까? 간단히 말해, 그것은 단지 일반적인 행동 일뿐입니다. 당신은 객체를 만들고 있으며, 그들은 메모리를 사용하고 있으므로, 당신의 기억은 증가하고 있습니다. 어떤 시점에서 가비지 수집기는 메모리를 확보하기 위해 콜렉션을 수행해야한다고 결정합니다. 아마도 시스템이 오래 동안 실행되지 않았고 더 많은 작업이 필요할 수 있습니다. C# 언어가 지정하는 다른 조건이 길어 졌을 가능성이 있습니다. 컬렉션이 실제로 필요할 때 거의 항상 당신보다 더 잘 알고 있습니다.

실제 문제가 생길 때까지는 걱정하지 마십시오. 관리되는 언어에서는 정상적인 동작입니다.메모리가 부족하거나 컬렉션 이 발생해도 메모리가 다운되지 않으면이 발생하면 문제를 찾기 시작할 필요가 있습니다.

관련 문제