我一直在试图追踪我们的应用程序中的内存泄漏,并继续发现自己回望Spark元件作为罪魁祸首。火花内存泄漏
我想我已经找到了原因,但是我对垃圾收集的理解/ mark &不是太热,所以我想验证我的发现。
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。
反过来,这将防止任何其他引用TextContainerManager
实例的实例也被GC'd。
尽管这个理论与我在应用中看到的一致,但我不能相信在这样的低级别spark组件中确实存在内存泄漏。
有人可以请说明这一点吗?
顺便说一句 - 我已经开了bugs.adobe.com缺陷跟踪这个问题,它应该被证明是一个真正的错误: https://bugs.adobe.com/jira/browse/SDK-29531
票你diff'd 4.1和4.5之间TextLayoutManager,看看有什么变化了? – 2011-02-18 17:14:37