2013-05-22 1 views
-1

일부 읽기 후에 C#으로 코딩 한 모든 것이 코드 관리이며 메모리 누수를주지 않아야한다는 것을 알았습니다. 그러나 내 프로그램은 일종의 메모리 누수를 암시하는 방식으로 동작합니다.user32 및 메모리 누수가 발생 했습니까?

내 전체 프로그램은이 내려 온다 :

while(true) 
{ 
    //Source of the "leak" 
    List<object> _objects = ReturnAllWindows(); 

    //Do something awesome with the list... 

    System.Threading.Thread.Sleep(10); 
} 

ReturnAllWindows 모든 창문을 얻을 user32.dllEnumWindows와 함께 pinvoke를 사용하는 방법이다 (현재 내가 실제 코드를 가지고 있지 않습니다) 현재 열려 있습니다.

내 프로그램을 실행하면 OutOfMemoryException이 될 때까지 즉시 메모리가 급증합니다.

제가 읽은 바로는 생각할 수있는 유일한 것은 EnumWindows 함수에서 메모리 누수가 발생하지만 입니다. user32가 완전히 관리되지 않는다고 상상하기가 쉽지 않습니다.

그래서 무슨 일입니까? 어떻게 예방할 수 있습니까?

편집


: 그것을 해결, 문제는이 목록은 나중에 제대로 처리되지 않은 일부 멀티 스레딩과 함께 사용하는 것이 었습니다. ReturnAllWindows 행에 주석을 달면 멀티 스레딩에 도달하지 못했고 플랫폼 호출은 전혀 문제가되지 않았습니다.

+0

GC.Collect()를 호출 해 보았습니까?당신이'OutOfMemoryException'을 얻는 것은 이상하게 보일뿐입니다.'GC.Collect()'를 호출하면 예외를 피할 수 있었을 것입니다. 그러나 그게 어떻게 된 것입니까? – Nolonar

+0

"C#으로 코딩 한 모든 것은 관리되는 코드입니다. " : 정확히. 포인터에 액세스하려면 [unsafe] (http://msdn.microsoft.com/en-us/library/t2yzs44b.aspx) 키워드를 사용할 수 있습니다. – cvraman

+0

GetWindows() 코드가 있습니까? 어떻게 메모리를 할당합니까? 전역/스레드 메모리를 사용하여 목록을 작성하거나 목록을 작성하고 전역/스레드 변수에 저장하면 목록이 제어 불능 상태가 될 수 있습니다. GetWindows() 코드가 없으면 진단하기가 어려울 것입니다. – Richard

답변

1

platform invoking (즉, 관리 코드에서 네이티브 관리되지 않는 메서드를 호출하는 경우) 메모리가 다른 방식으로 완전히 관리되지는 않습니다. 잠시 이것에 대해 생각해보십시오. 관리되지 않는 네이티브 응용 프로그램은 관리되는 코드에서 호출되는 것을 지원하기 위해 작성된 것이 아닙니다. 따라서 객체는 관리되지 않는 메모리로 존재합니다.이 메모리는 저급 시스템 (개발 된 경우) 또는 제어되지 않는 시스템에 의해 제어됩니다. 따라서 관리되는 코드에서 네이티브 메서드를 호출하면 boxing이라는 이름을 사용하여 네이티브 메모리를 래핑하는 관리되는 개체를 만듭니다.

.NET에서 메모리 누수가 있습니까? 기술적으로, 아니. 전통적인 의미가 아닙니다. 그러나 쓰레기가 존재한다는 생각은 확실히 사실입니다. 그리고 권투를 다루는 것은 GC를 더 혼란스럽게 만든다.

나는 박스형 데이터 목록의 멋진 조작 어딘가에 객체의 역 참조가 있어야한다고 생각합니다. 예를 들어 foreach를 사용하여 데이터 컬렉션을 반복하고 각 사이클이 완료된 후에 더 이상 데이터가 필요하지 않으면 관리되는 모든 참조를 제거해야합니다. 항상 어떤 식 으로든에서 참조 있기 때문에

List<object> foo = new List<object>(); // Imagine this is your list of data 

foreach (var item in foo) 
{ 
    // Execute an awesome expression here 
} 

겉보기에 무해한,이 표현은 메모리를 해제하지 예를 들어, 다음 예제를 고려하십시오. 다음과 같이의 메모리 최적화 된 버전은 다음과 같습니다 두 번째 예에서이 리소스에 남아있는 참조가없고, 포장 된 데이터가 지금 컬렉션의 대상이 얼마나

List<object> foo = new List<object>(); // Imagine this is your list of data 

while (foo.Count > 0) 
{ 
    var item = foo[0]; 

    // Execute an awesome expression here 

    item = null; 
    foo.RemoveAt(0); 
} 

알 수 있습니다. 이제는 .NET의 메모리 문제를 흔히 추적하기가 어렵 기 때문에 전체 문제가 아닐 수도 있습니다. 응용 프로그램의 프로파일 링을 고려하여 특정 문제를 더 잘 이해할 수 있습니다. 희망이 도움이됩니다.