actionscript 3 -内存优化在空气应用程序



我有一个简单的空气应用程序,部署在服务器上。它所做的就是每5分钟向网页发出一个httpService请求。由于某种原因,它开始时的内存利用率为25MB(任务管理器),并且每天在此基础上增加大约1MB。我不明白为什么它会占用内存。在应用程序的初始化中,我有一个定时器的eventlistener。我读过一些关于内存优化和air应用开发最佳实践的文章。他们说您应该在事件侦听器被触发后删除它们。但如果我这样做,计时器将不会触发任何函数后,它触发一次。有人能分享一下关于优化这个的想法吗?下面是我的代码片段:

private var service:HTTPService; 
private function init() :void { 
service = new HTTPService(); 
service.method = "GET"; 
service.url = serviceUrl; 
service.addEventListener(ResultEvent.RESULT, httpResult);
service.addEventListener(FaultEvent.FAULT, httpFault); 
callhttpService(); 
pingTimer = new Timer(pingInterval,0);
pingTimer.addEventListener(TimerEvent.TIMER,timer_doth­is);
} 
private function callhttpService():void { 
  service.send();
} 
private function timer_dothis(evt:TimerEvent):void { 
  callhttpService(); 
}

基本上你不能在Flash/AIR中管理内存。内存由虚拟机内部使用MMgc进行管理。

https://developer.mozilla.org/en/MMgc

所以基本上你已经开始读的东西是正确的(某种程度上),你需要完全取消引用对象,以确保垃圾收集器在下一次传递中拾取它们,其频率是由VM内部根据VM运行的系统的性能决定的。至于计时器事件,我不会说您需要一遍又一遍地删除/重新添加侦听器,但可能会在事件回调(e.s stopimmediatepropagation())中停止事件传播。

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/events/Event.html stopImmediatePropagation ()

但是所有这些都将阻止事件在其他任何地方被处理或冒泡,我一点也不认为这是导致内存泄漏的原因。最可能的情况是,你在某个地方创建和销毁对象,或者创建对象后简单地丢弃它们,而没有真正正确地销毁它们。下面是一篇关于跟踪flash/AIR泄漏的文章的链接。它很好地解释了整个事情是如何从actionscript端工作的:

http://divillysausages.com/blog/tracking_memory_leaks_in_as3

如果您通读了那篇文章,然后检查您的代码并将其缩小到您认为是问题但不确定的地方,用一些代码片段更新您的问题,我将更新我的答案以解决您发布的任何问题。:)

很明显,您的应用程序存在内存泄漏。当然,在处理事件后取消订阅是非常有用的建议。与事件相关的内存泄漏是常见问题之一。

你不应该取消订阅定时器事件,因为它仍然在你的应用程序中使用。但是看一下http调用相关的代码。如何执行呼叫?也许您在每次调用时都创建新的请求对象,并且在使用它们取消订阅相应事件后不清理内存?

无论如何,没有代码,我们无法给你一个解决特定问题的建议。只建议。

如果你放弃寻找有问题的代码,你可以使用profiler,这是Flash Builder Premium的一部分。它可以帮助你。

最新更新