Как обнаружить утечки памяти в профилировщике? - PullRequest
2 голосов
/ 20 июля 2009

У меня есть приложение AIR / Flex, которое я сделал, у меня есть несколько человек, которые его тестируют, и все сообщают, что после того, как оно какое-то время работает, оно заставляет все машины работать очень медленно. Сначала он работает нормально, так что это должно быть где-то утечка памяти. Я использовал профилировщик для этого, и единственное, что показывает, как использование значительного объема памяти, это MethodQueueElement , который не является классом, который я написал, и я понятия не имею, что он делает, я предполагаю, что его часть Flex Framework. Я не знаком с использованием профилировщика, так что я не уверен, на что я буду обращать внимание, это был единственный класс с высоким «памятью», и в нем говорилось, что у него более 100 000 экземпляров. Если это моя проблема, что я могу сделать, чтобы это исправить? Я даже не знаю, что делает этот класс или что-то о том, как он создается.

Спасибо

1 Ответ

2 голосов
/ 20 июля 2009

Класс MethodQueueElement является внутренним классом класса mx.core.UIComponent. Он используется для представления вызова метода, который был поставлен в очередь вызовом callLater. Метод callLater является частью открытого интерфейса UIComponent, поэтому либо вы вызываете его в своем коде, либо он вызывается платформой (как это происходит в UIComponent.setFocus, например,)

Чтобы освободить все экземпляры MethodQueueElement, UIComponent заменяет текущий массив MethodQueueElements новым (пустым). (в методе callLaterDispatcher2) Таким образом, единственный способ устранить утечку памяти - предотвратить вызов callLaterDispatcher2.

Чтобы отладить это, вы можете начать устанавливать точки останова (пока ваше приложение работает) в методах callLater (здесь создаются ваши экземпляры, так что как-то он вызывается все время, посмотрите на трассировку стека здесь!), CallLaterDispatcher2 ( я предполагаю, что он не будет вызван), и проверим, является ли UIComponentGlobals.callLaterSuspendCount! = 0, что может быть причиной того, что callLaterDispatcher2 не вызывается.

Если последнее имеет место, я подозреваю, что у вас есть подростки или что-то еще, вызывающее UIComponent.suspendBackgroundProcessing, но затем не вызывающее resumeBackgroundProcessing (из-за исключительной ситуации, завершающей код перед достижением вызова resumeBackgroundProcessing, например.)

...