我一直在試圖追蹤我們的應用程序中的內存泄漏,並繼續發現自己回望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