我看了代码后会怀疑存在任何内存泄漏,因此我对自己的代码进行了测试。
您发布的代码实际上无法运行。我只是说的最少要跑它像应用标签和import语句(和反标签看到一个http服务周期完成时):
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="application1_creationCompleteHandler(event)">
<mx:Script>
<![CDATA[
import mx.rpc.http.HTTPService;
import mx.collections.XMLListCollection;
import mx.rpc.events.ResultEvent;
import mx.events.FlexEvent;
private var xmlC:XMLListCollection = new XMLListCollection();
private var httpS:HTTPService = new HTTPService();
private var timer:Timer = new Timer(1000);
private var xmlData:XML;
private var xmlDataList:XMLList;
protected function application1_creationCompleteHandler(event:FlexEvent):void
{
httpS.url = "data.xml";
httpS.addEventListener(ResultEvent.RESULT, resultHTTP);
httpS.resultFormat="e4x";
httpS.send();
timer.start();
timer.addEventListener(TimerEvent.TIMER, updateXMLC);
}
private function updateXMLC(event:TimerEvent):void
{
xmlC.source = xmlDataList;
httpS.send();
}
private function resultHTTP(event:ResultEvent):void
{
counter.text = Number(parseInt(counter.text,10)+1).toString();
xmlData = event.result as XML;
xmlDataList = xmlData.dg.rows.row;
}
]]>
</mx:Script>
<mx:Label id="counter" text="0" horizontalCenter="0" verticalCenter="0" fontSize="72"/>
</mx:Application>
好消息是不会有任何内存泄漏你的代码。 Profiler中也没有任何游荡物体。
坏消息是你在你的应用程序中做了什么(代码不在这里发布,因为什么原因省略) - 这是你有泄漏/游荡物体的地方。
您可以在附加代码的分析器中看到自己,http服务的前几个周期后内存不会增加。即它不会持续地抓住更多的记忆。 (顺便说一句,我拉入的XML文件大约有8000行,超过1MB)。
如果你想发布更多的代码,高兴看得更远 - 但认为这现在解决了这个谜。 ;)
这里是为了什么你做一些修正:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="application1_creationCompleteHandler(event)">
<mx:Script>
<![CDATA[
import mx.rpc.http.HTTPService;
import mx.collections.XMLListCollection;
import mx.rpc.events.ResultEvent;
import mx.events.FlexEvent;
[Bindable] private var xmlC:XMLListCollection = new XMLListCollection();
private var httpS:HTTPService = new HTTPService();
private var timer:Timer = new Timer(1000);
private var xmlData:XML;
private var xmlDataList:XMLList;
private var serviceRunning : Boolean = false;
private var currentData : String = '';
protected function application1_creationCompleteHandler(event:FlexEvent):void
{
httpS.url = "data.xml";
httpS.addEventListener(ResultEvent.RESULT, resultHTTP);
httpS.resultFormat="e4x";
httpS.send();
timer.start();
timer.addEventListener(TimerEvent.TIMER, updateXMLC);
}
private function updateXMLC(event:TimerEvent):void
{
xmlC.source = xmlDataList;
if(!serviceRunning){ // don't call for more data until
httpS.send(); // you've gotten back last call
}
}
private function resultHTTP(event:ResultEvent):void
{
// make sure we have differences before rebinding
var newData : String = event.result as String;
serviceRunning = false;
counter.text = Number(parseInt(counter.text,10)+1).toString();
if(newData != currentData){
xmlData = event.result as XML;
currentData = newData;
xmlDataList = xmlData.dg.rows.row;
}
}
]]>
</mx:Script>
<mx:Label id="counter" text="0" horizontalCenter="0" verticalCenter="0" fontSize="72"/>
</mx:Application>
我不清楚你想问什么问题。您不会创建新的XMLListCollection;你只是重复使用相同的变量。不知道如何使用或引用XMLListCollection中的数据,就不可能确定为什么它不会被垃圾收集。 – JeffryHouser
这就是完整的代码,当更改XMLListCollection的源代码时,似乎有些监听器使用了XMLNotifier.getInstance()。watchXML,我认为这可能导致内存泄漏 – Mansuro
您没有提供可运行代码片段,这导致我得出的结论是必须有更多的代码。 – JeffryHouser