2012-04-16 3 views
11

이상한 동작이 있습니다. 다음과 같이 완벽하게 작동하는 DLOG-Terminal (Windows Embedded Standard SP1)에서 실행되는 WPF 응용 프로그램을 실행하는 대량의 메모리 누수가 발생합니다.WeakReferences는 임베디드 OS에서 해제되지 않았습니다.

문제를 찾기 위해 많은 노력을 기울 였는데, 그 중 하나를 모니터 옆에 직접 설치하고 ANTs MemoryProfiler를 설치 한 다음 1 시간 동안 테스트하여 두 가지 모두에서 사용자 작업을 시뮬레이션 해 보았습니다. 터미널과 내 개발 PC.

결과로, 이상한 이유로 인하여 임베디드 시스템은 많은 양의 WeakReference 및 EffectiveValueEntry [] 객체를 쌓습니다.

개발 (PC) : enter image description here

enter image description here

그리고 터미널 : enter image description here

그냥 ... 클래스 목록을 을 볼

여기

있는 몇 가지 사진입니다 enter image description here

누구나 이전에 이와 비슷한 것을 보았으며 이에 대한 해결책이 있습니까? 어디에서 도움을받을 수 있습니까?

(PS .net4 준비 이미지와 함께 설치된 단말기)

PPS : 근접 유권자를 위해 : 나는 질문이 분명하다 생각 : 나는이 문제를 해결할 수있는 방법. 이것은 프로그래밍 문제 N 대 IT/OS의 문제가 있지만 그것은 시간에 오프 주제 가까이 얻을 것이다 오류서버에서이 게시하면 내가 생각하는 경우 당신은 ... 주장 할 수

UPDATE : 문제의 큰 부분을 발견 할 수 있었지만 C++과 조금 비슷합니다. ICommand (RelayCommand-pattern)를 제공하는 WPF-List에 대해 ViewModel 류의 Items 클래스를 사용합니다. 보기 용 ViewModel 속성의 getter에서 즉석에서 작성된 항목이며 응용 프로그램/GC가 사용하지 않는 명령이나 CanExecuteChanged에 대한 구독을 결코 해제하지 않은 것처럼 보입니다 - 메모리 프로파일 러는 " 약한 참조 ". 그 항목 - viewmodels 재사용 및 삭제/그들의 Dispose 사용 된 모든 속성을 null로 설정하려면 내 코드를 변경하고 내가 너무 말했듯이 정리 :이 오래된 C++ 일 "삭제"같은 느낌. 여기에 강제 GC를 사용합니다. 매 30 분마다 수집하십시오 (예, 알 필요는 없지만 지금까지는 다른 해결책이 없습니다). 이 설정을 사용하면 응용 프로그램을 지금까지 문제없이 6 시간 이상 실행할 수 있지만 제대로 작동하지 않습니다.

그들이 내 데스크탑 컴퓨터에있는로 그있는 WeakReferences가 주장하지 않는 이유를 이해할 수없는 ...

이 어떤 생각? 부디!

업데이트 : 난 아직이 문제를 핀 수 아니에요하지만 난 이상한 행동을 참조 : 나는 터미널 중 하나에 내 소프트웨어의 동작을 관찰하는 PC-Anywhere를 사용하는 경우 문제가 사라질 ! 8 시간 후에도 실행됩니다.곧바로 소프트웨어가 정상적으로 실행됩니다. 메모리를 비울 것입니다. (주 화면에 약간의 메모리 카운터 표시를 해두겠습니다. 터미널에 연결하여 메모리가 부족하다는 것을 알리겠습니다. 잠시 기다린 후 메모리가 회수됩니다.))

Devin (한 답변 아래) 올바른 방향으로 리드가 있다고 생각합니다. 원격 제어 소프트웨어의 일부는 finalizer-thread 또는 GC를 차단하는 모든 항목을 차단 해제합니다. 시뮬레이션 된 키보드/마우스 또는 무엇이든간에 .

이 문제에 대한 의견이 있으십니까?

+1

이것은 디버거를 연결하지 않고 VB.NET 어셈블리의 Debug 빌드를 실행하는 것으로 알려진 문제입니다. Edit + Continue 지원을 위해 WithEvents 이벤트를 추적하기 위해 자동 생성되는 약한 참조가 누설됩니다. 그 외, 스크린 샷에서 코드를 리버스 엔지니어링하는 것은 불가능합니다. –

+1

첫 번째 : 이것은 VB.NET 코드 (문제가 아니어야 함)가 아니며 DEBUG 세트로 컴파일되지도 않습니다.이 두 가지 모두 위에는 디버거가 부착되지 않고 실행되었으며 동일한 프로파일 러의 동일한 버전에서 시작하여 동일한 어셈블리와 파일 (Xcopied)을 거의 동일한 데이터로 동시에 처리 할 수 ​​있습니다. WPF 코드 라인을 수없이 보거나 (** 모든 ** 코드를 원하십니까?) 텍스트 파일 ... 아니 오픈 소스 BTW) – Carsten

+0

문제에 대한 참조 @ HansPassant 언급 (예, VB.NET 여기에 중요합니다 : http://support.microsoft.com/?kbid=919481 – roken

답변

5

태블릿에서 내 앱을 실행하는 것과 비슷한 문제가있었습니다. 메모리는 데스크톱에서 실행할 때 재생되지만 태블릿이나 PC 입력 패널을 사용하는 다른 장치에서는 실행되지 않습니다. 문제는 마무리 대기열이 막혔다는 것입니다. COM 개체 finalizer 메시지 루프가없는 주 스레드에서 뭔가를 실행하려면 기다리고있었습니다.

해결책은 Application.DoEvents()을 호출하기에 적절한 시간을 찾는 것이 었습니다. 간헐적으로 호출되는 메소드가 있었고 매 10 번째 호출마다 호출합니다. 나는 이것이 당신이 가지고있는 동일한 문제인지는 모르겠지만 어쩌면 그것은 약간의 빛을 발산 할 수 있습니다.

편집 : 일반적으로 DoEvents()으로 전화하는 것이 좋지 않음을 분명히해야합니다. 이 경우 해당 스레드에 UI가 없거나 해당 이벤트가 간섭 할 수있는 상황이 발생하기 때문에 작동합니다.

+0

매우 조사 중입니다. 한번에 이것을 점검 할 것입니다! - BTW : 소프트웨어 (?) 키보드를 비활성화/종료해도 문제가 해결 되었습니까? 장치에 키보드가 필요하지 않습니다. – Carsten

+0

올바르게 기억하면 키보드 입력 패널 DID를 사용하지 않도록 설정하여 문제를 해결할 수 있지만 기기를 더 이상 확인할 수 없으므로 확인할 수 없습니다. – Devin

+0

잠시 후 확인해 보니 문제가 해결되지 않습니다.필자는 입력 패널 소프트웨어를 제거하고 WinForms-DoEvent 및 심지어 수동 WPF-Dispatcher 호출을 사용해 보았습니다. 그러나 감사의 말을 전합니다. 올바른 방향을 가리키고 있다고 생각합니다. – Carsten

2

스크린 샷에서 LOH가 사용 공간이 커지면서 동시에 커지는 것을 보는 것이 흥미 롭습니다. 고정 된 객체로 인한 메모리 단편화를 나타내는 여유 공간이 LOH에서 많이 증가하고 있습니다. 이것은 관리 객체의 정리를 막는 고정 된 종료 기 스레드와 같습니다. 메모리 덤프를 가져 와서 파이널 라이저 스레드가 멈추었는지 확인해야합니다. Windbg로 아주 쉽게 할 수 있습니다.

관련 문제