Я пытался отследить утечки памяти в нашем приложении и постоянно возвращаюсь к тому, чтобы рассматривать компоненты Spark как виновника.
Я думаю, что нашел причину, но мое понимание «Сборка / маркировка мусора» не слишком горячо, поэтому я хотел бы проверить свои выводы.
Многие классы в Spark используют RichEditableText
для отображения своих текстовых свойств (ComboBox
, TextInput
).
RichEditableText
имеет локальное свойство textContainerManager
и часто вызывает compose()
для этого.
Вот соответствующий сокращенный отрывок из TextContainerManager
// Line 282 - 292:
static private var stringFactoryDictionary:Dictionary = new Dictionary(true);
static private function inputManagerStringFactory(config:IConfiguration):StringTextLineFactory
{
var factory:StringTextLineFactory = stringFactoryDictionary[config];
if (factory == null)
{
factory = new StringTextLineFactory(config);
stringFactoryDictionary[config] = factory;
}
return factory;
}
// Line 1204:
public function compose() {
// Line 1238:
var inputManagerFactory:TextLineFactoryBase = (_sourceState == SOURCE_STRING) ? inputManagerStringFactory(_config) : _inputManagerTextFlowFactory;
// Line 1242:
inputManagerFactory.swfContext = Configuration.playerEnablesArgoFeatures ? this : _swfContext;
}
Строка 1242 является ключевой строкой, поскольку она дает статическому словарю ссылку на наш компонент.
(Примечание. Я проверил это с помощью отладчика, чтобы подтвердить, какая ветвь троичной системы выполняется.) Это предотвратит сборку мусора экземпляром.
Например: статический словарь имеет значение со ссылкой на экземпляр - экземпляр не может быть GC'd.
В свою очередь, это предотвратит GC'd любые другие экземпляры, имеющие ссылку на экземпляр TextContainerManager
.
Хотя эта теория, безусловно, соответствует тому, что я вижу в нашем приложении, я не могу поверить, что в таком низкоуровневом искровом компоненте действительно есть утечка памяти.
Может кто-нибудь пролить свет на это?
Кстати, я открыл дефект на bugs.adobe.com, чтобы отследить эту проблему, если она окажется подлинной ошибкой:
https://bugs.adobe.com/jira/browse/SDK-29531