Actionscript 3 允许解释XML会导致30 MB内存泄漏
如果您精通AS3中的E4X和XML,请看看这种疯狂 我有一个420 KB的XML。相当大,是的。其结构相当简单:Actionscript 3 允许解释XML会导致30 MB内存泄漏,actionscript-3,Actionscript 3,如果您精通AS3中的E4X和XML,请看看这种疯狂 我有一个420 KB的XML。相当大,是的。其结构相当简单: <Nodes> <Node ID="1"> <Element Name="A" /> <Element Name="B" /> </Node> </Nodes> 现在奇怪的部分来了: 运行应用程序。 使用50个字典值中的10个初始化某些对象。 内存消耗:36 MB。 运行应用程序。 使用
<Nodes>
<Node ID="1">
<Element Name="A" />
<Element Name="B" />
</Node>
</Nodes>
现在奇怪的部分来了:
运行应用程序。
使用50个字典值中的10个初始化某些对象。
内存消耗:36 MB。
运行应用程序。
使用字典的所有50个值初始化对象。
内存消耗:47MB。
但是。。。如果我这样做:
for each (var obj: XML in objects)
_SomeDictionary[int(obj.@ID)] = obj.Element;
for each (var obj: XML in objects)
_SomeDictionary[int(obj.@ID)] = String(obj.Element);
我明白了:
运行应用程序。
使用字典的所有50个值初始化对象,在初始化之前,将字典的值强制转换回XMLList。
内存消耗:16 MB。
因此,通过将XMLList转换为字符串,我节省了30 MB的内存。为什么会发生这种情况?最终,在处理字典值的初始化函数中,将始终创建一个XML列表
第二个问题:当不转换为字符串时,为什么在处理字典的值时内存会增加???它们都已经是XML列表了!为什么当我从字典中提取XML列表并使用一个函数来初始化一些基于它的对象时,内存只从36MB增长到47MB
注意:该函数不会导致内存泄漏:我已经证明,当我使用同一个函数时,我只得到16 MB的内存,但我没有给它一个直接从字典中提取的XML列表,而是给它一个从字典中提取的字符串中提取出来的XML列表。也许可以解释这一点
在Flash中,即使仅使用片段,也会引用主字符串:
var str:String = "ABCDEFGHIJKLMNOPQRSTUV".substr(0,2);
trace(str + " has master string " + flash.sampler.getMasterString(str));
// output: AB has master string ABCDEFGHIJKLMNOPQRSTUV
内存使用是您的应用程序的一个问题吗?内存使用从来都不是一个问题吗?我认为这样做是不健康的。但要回答你的问题,不,30MB不是问题。47MB,16MB,同样的事情:100MB以下。但是这让我很恼火,我更愿意保持内存使用率尽可能低,因为这些东西是成群结队地出现的,如果你让它们堆积在那里,你会在2个月后醒来,发现一个巨大的程序,你会想这到底是从哪里来的::-D。