2009-07-20 4 views
2

내가 만든 AIR/Flex 응용 프로그램을 가지고 있는데, 몇 사람들이 그것을 테스트하고 모든 사람들이 잠시 실행 한 채로두고 나면 모든 컴퓨터가 매우 느리게 실행되는 것을보고합니다. 처음에는 잘 실행되기 때문에 어딘가에서 메모리 누수가 발생합니다. 나는 이것에 대한 프로파일 러를 사용했고, 상당한 양의 메모리를 사용하는 것으로 보이는 유일한 것은 입니다. MethodQueueElement은 제가 작성한 클래스가 아니며, 그것이 무엇인지 전혀 모릅니다. Flex 프레임 워크의 일부로 가정하고 있습니다. 나는 프로파일 러를 사용하는 것에 익숙하지 않아서 내가 바라보고있는 것이 무엇인지 모르겠다. 그것은 단지 "기억"이 높았던 유일한 클래스 였고 그것이 100,000 개가 넘는 인스턴스를 가졌다 고 말했다. 이것이 내 문제라면 그것을 해결하기 위해 무엇을 할 수 있습니까? 나는이 클래스가 무엇을하는지 또는 그것이 어떻게 인스턴스화되는지에 관해서조차 모른다.프로필러에서 메모리 누수를 발견하는 방법은 무엇입니까?

감사

+0

버전 (때문에에 resumeBackgroundProcessing 호출 예에 도달하기 전에 코드를 종료 예외의)에 resumeBackgroundProcessing를 호출하지 다음 UIComponent.suspendBackgroundProcessing 호출하지만이 있는지, 의심, 경우이어야한다 플렉스 프레임 워크 (또는 flex 프레임 워크에서 특정 프레임 워크를 컴파일하지 않을 때)를 사용하고 있습니까? – Janosch

답변

2

MethodQueueElement 클래스는 mx.core.UIComponent의 클래스의 내부 클래스입니다. callLater 호출로 대기열에 포함 된 메소드 호출을 나타 내기 위해 사용됩니다. callLater 메서드는 UIComponent의 공용 인터페이스의 일부이므로 코드에서 호출하거나 프레임 워크에서 호출합니다 (예 : UIComponent.setFocus에서 발생).

모든 MethodQueueElement 인스턴스를 해제하려면, UIComponent는, 현재의 MethodQueueElements의 배열을 새로운 (하늘의) 배열로 옮겨 놓습니다. (callLaterDispatcher2 메서드에서) 그래서 callLaterDispatcher2가 호출되지 않도록 메모리 누수를 만드는 유일한 방법이 있습니다.

이 문제를 디버깅하려면 callLater 메서드에서 중단 점을 설정하기 시작할 수 있습니다 (여기에서 인스턴스가 만들어 지므로 항상 호출되므로 어떻게되는지 여기에서 스택 추적을보십시오). callLaterDispatcher2 (나는 그 전화를받지 못한다고 가정), UIComponentGlobals.callLaterSuspendCount가 있는지 확인하십시오! = 0, callLaterDispatcher2가 호출되지 않는 이유가 될 수 있습니다.

후자 내가 당신을 트윈 또는 뭔가 다른