2011-02-01 3 views
1

우리는 SL4, PRISM 및 MVVM을 사용하여 LOB 응용 프로그램을 작성하고 있습니다. 최근에 내 앱이 메모리를 공개하지 않는다는 사실을 알게되었습니다. b/w 페이지를 전환하면 약 150MB에서 시작하여 1GB 이상으로 빠르게 증가합니다. 우리의 디자인은 이벤트를 청취하고 뷰를 적절한 영역에 주입하는 Controller 클래스 (Unity singleton)를 각각 갖는 3 개의 모듈을 포함합니다. 이벤트를 발생시켜 뷰를 삽입 할 때 이러한 컨트롤러에서 일어나는 일입니다.Silverlight 프리즘/단일체 메모리 누수

var v = Container.resolve<view>() 
var vm = Container.resolve<viewmodel>() 
v.datacontext = vm; 
myregion.addtoregion(v); 

그래서이 뷰를 호출하면이 100 번을 종료합니다. 그리고 addviewregion 메서드에서 새 뷰를 추가하기 전에 기존 뷰를 모두 제거합니다. 그리고 메모리 문제를보고 난 후, 제거해야 할 모든 뷰에 대해 addviewtoregion 메소드에서 뷰 & viewmodel을 null로 설정했습니다. 여전히 메모리 소비는 동일합니다. Unity ContainerControllled ...이 객체에 대한 참조를 보유하고있는 객체 (내 컨트롤러)입니까?

답변

1

동적 뷰의 이벤트를 처리하기 위해 등록하고 뷰를 제거하기 전에 등록을 잊어 버리셨습니까? 이벤트를 처리하면 객체에 대한 암시 적 참조가 만들어지고 일반적으로 관리되는 메모리 누수가 발생합니다.

WinDbg을 사용하여 새는 Silverlight 컨트롤을 추적하려면 this guide을 확인하고 힙과 GC 루트를 검사해야합니다.

+0

이것은 가능한 원인입니다. 이벤트 수집기 이벤트에 약한 이벤트 처리를 사용해야합니다. –

+0

해결 된 단일 객체가 가비지 수집되지 않거나 컨테이너 구성에 문제가있는 것 같습니다. 다음 코드로 테스트했습니다. – user396491

+0

WeakReference ref1 = new WeakReference (Container.Resolve

()); WeakReference ref2 = new WeakReference (새 꼬리말()); GC.Collect(); GC.WaitForPendingFinalizers(); bool isRef1Alive = ref1.IsAlive; bool isRef2Alive = ref2.IsAlive; 바닥 글은 UserControl이며 여기에서 첫 번째 것은 true를 반환하고 두 번째 것은 false를 반환합니다. Container는 해결 한 항목에 대한 참조를 보유하고 있습니까? BTW, 나는이보기에 대한 인터페이스가 없습니다. 나는 컨테이너를 추가했습니다. RegisterType (); 부트 스트 래퍼 (ConfigureContainer 메소드)의 . 여전히 같은 결과. – user396491