2009-11-12 2 views
0

MDI 응용 프로그램 내에서 메모리 누수를 추적하고 있습니다. 양식을 열고 닫으면 양식이 메모리에 남아있게됩니다. 개미의 메모리 프로파일 러를 사용하여 메모리에 폼을 유지하는 다음 참조 그래프를 얻을 수 있습니다.메모리 누수/형식이 가비지 수집되지 않습니다.

폼에 Dispose 발생시 콤보 컨트롤에 첨부 한 모든 이벤트를 제거했습니다.

누구든지 나를 향해 해결책을 제시 할 수 있습니까?

C1 네임 스페이스는 ComponentOne에서 가져옵니다.

C1Combo 컨트롤의 c, r, b 등의 메소드가 리플렉터를 통해 무엇인지 알아 내려했지만 필연적으로 이해하기 어려운 obfusticator를 통해 실행되었습니다.

Ant's Reference Graph

답변

0

C1Combo의 컨트롤에 대한 내부 참조로 추적했습니다. 어떤 이유로 든 양식에 대한 언급과 다른 몇 가지 사항이있는 목록이 있습니다. 폼의 Dispose()에서 각 C1Combo 컨트롤에 대해이 함수를 호출합니다. 결과에 대한 아무런 생각이 없습니다. 어쨌든 컨트롤을 폐기해야 할 가능성은 거의 없습니다.

새 버전을 출시 한 것처럼 매우 약해서 obfustication이 모든 메소드/필드 이름을 엉망으로 만듭니다.

private void RemoveInternalC1ComboReferenceListHack(C1Combo combo) 
    { 
     var result = typeof(C1Combo).GetField("_dropDownList", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(combo); 
     var result2 = result.GetType().GetField("c", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(result); 
     var result3 = result2.GetType().GetField("r", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(result2); 
     var result4 = result3.GetType().GetField("b", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(result3); 

     ((System.Collections.Generic.List<Control>)result4).Clear(); 
    } 
1

C1 내부 레퍼런스를 해제하지 않음으로써 버그를 가질 수있다. Contact the company or search their knowledgebase.

다른 제 3 자 구성 요소 세트를 사용하면 Telerik 컨트롤에보고 된 버그가 있었음을 기억하고 있으며 다음 릴리스에서 수정되었습니다. 즉각적인 해결 방법을 제공 할 수 있습니다.

2

이것은 1.1 년 전에 .NET에 구축 한 거대한 C# WinForm 앱을 생각 나게합니다. 나는 .NET Memory Profiler을 사용했고, 소년은 기생충을 찾도록 도와주었습니다. 개미의 MP도 그렇게 할 수 있습니다.

필자의 경우, 사용하는 동안 많은 양의 병렬 스레드와 타이머가 생성되었습니다. 범인은 타이머 인스턴스로 밝혀졌습니다. 타이머 인스턴스는 올바르게 처리되지 않아서 타이머가 실행되는 생성 된 스레드를 절대로 종료하지 못했습니다.

직접 답변을 드릴 수는 없지만, 스레드가 산란 해있는 경우 집중 치료, 특히 그 안에있는 물건들을 감시하거나 처리하십시오.

필자의 경우 메모리 보류가 더 많거나 대부분 메모리 누수라고 주장 할 것이다.

문제의 원인이 제 3 자 구성 요소에서 비롯된 것이라면 잘 찾아야합니다.

당신의 행운을 빌어 요 범인 누수를 빕니다!

+0

정확합니다. 여기서 메모리 누수는 약간의 잘못된 이름입니다. – Gregory

관련 문제