2012-06-14 3 views
2

레거시 응용 프로그램에서 메모리 누수가 발생하여 코드를 잘 알지 못합니다. 나는 MemProfiler를 사용하여 분석하여 점점 많은 수의 객체가 TimerCall 객체에 의해 참조된다는 것을 알아 냈습니다. 이 TimerCallback_TimerCallback 개체로 참조되며 루트의 하위 항목입니다. 그래프는 Root ->_TimerCallback ->TimerCallback ->MyObject입니다. MyObject 이후메모리 누수 : 루트가 참조하는 TimerCallbacks 객체

처럼 여러 통화가 생성자에 TimerCallback 필요 :이처럼 그것을 할 나에게 매우 어색하게 보이는

new MyObject(int timeout, new TimerCallback(SomeCallbackMethod)); 

솔직히,하지만 내가 쓴대로 레거시 응용 프로그램의과 "C 스타일"C#으로 많은 null 할당과 Dispose()이 호출되었습니다 ...

그래서 TimerCallback에 대한 참조를 루트에서 제거 할 수 있습니까?

+0

해결 방법을 찾으셨습니까? 내 앱에는 타이머 코드가 있지만 타이머를 완료하면 항상 타이머를 처리하고 동일한 문제가 발생합니다. – Jimbidf

답변

1

귀하의 TimerCallbackTimer 개체에서 사용되고있는 것 같습니다. 타이머가 작동하는 이유는 무엇입니까? 그들은 콜백을 유지하는 진정한 뿌리가 될 것 같습니다.

리플렉터에서 나는 _TimerCallback 클래스를보고 있었는데, 어떤 일이 벌어지는 지 완전히 이해하지 못했지만이 클래스는 빨간 청어라고 생각합니다. 나는 근본 원인이 타이머 (어쩌면 무능하게하는 그들조차이다)다는 것을 나는 생각한다.

+0

아직 메모리 누수에 대한 해결책을 찾지 못했지만 코드에 새로운 Timer (...) 호출이 많이 포함되어 있기 때문에 일부 Timer 객체가 올바르게 제거되지 않아서 문제가 발생한 것처럼 보입니다. 코드를 작성한 사람은 매번 새로운 인스턴스를 만들 필요없이 Timer를 시작하고 중지 할 수 있다는 사실을 알지 못했습니다. – phatoni