PhoneGap内存管理

时间:2013-09-20 08:00:23

标签: javascript backbone.js memory-management memory-leaks cordova

几个月来,我一直在使用PhoneGap 2.8开发Android应用,在javascript方面,我使用BackbonejQuery作为我的主要框架。随着我的应用程序增长到合理的大小,我开始注意到相当大的内存消耗。阅读了不同文章解释为什么PhoneGap需要大量内存甚至运行,我仍然相信我可以对我如何使用内存做一些优化。

BackBone中,我们有一个Router对象,它将URI-s映射到特定的函数,这些函数为我提供了一个称为View对象的东西。我不仅实现了我的路由器功能来创建视图并渲染它,而且还存储了对当前正在显示的视图的全局引用。因此,在创建新视图之前,我会告诉旧视图进行一些清理(由于视图可以包含更多“子”视图,所以这是递归完成的)。在清理中,我目前告诉视图取消发布他的事件(我相信Backbone删除了事件监听器)。目前没有做更多的事情。呈现新视图后,全局变量将引用新视图。我相信javascript GC会释放旧视图使用的内存。唉,我不会发生这种事情 - 我越往我的应用程序导航越多,内存就越耗尽。我知道有一些内存泄漏,但我无法弄清楚它是什么,需要内存。我怀疑的一件事是旧的物体由于某种原因没有被正确地收集垃圾。我怀疑,一旦我在某个容器上渲染新的html(DOM),可能旧的DOM导致内存泄漏,也许某些事件处理程序被不必要地存储在某个地方。

我想知道的是,是否有任何工具或命令或提示如何调试/跟踪/测量分配内存的位置。有没有办法访问所有事件侦听器并以某种方式测量它们(DOM相同)。任何有关智能记忆效率技术的文章也将受到赞赏。目前我唯一可以做的事情就是开始递归地删除对象的所有属性(在最终对象中)我愿意销毁。

非常欢迎任何建议! 先感谢您。

1 个答案:

答案 0 :(得分:3)

我遇到了与我的第一个phonegap应用程序类似的问题。我们设法应用的技术很少

*旧视图 - 视图导航

  • 取消绑定与旧视图相关联的所有事件
  • 从dom中删除附加到视图的所有节点,以确保事件也被删除
  • 删除旧视图对象,模型/集合,以便DOM上没有剩余实例
  • 此外,尝试尽可能多地使用原型,因为通过原型创建的函数只占用RAM中的空间一次。因此,如果再次创建/启动视图,则不会再将其关联/子函数推送到RAM中
  • 大多数imp,确保'this'指针不会在文件之间的任何位置泄漏。我的一个工作场所经常在1.5小时的游戏后被卡住,经过一周的调试后,我们发现2个文件/对象/视图之间存在漏洞,这创建了一个循环引用并使DOM成为爆炸。

您也可以尝试使用Google Chrome的分析工具

几条有用的链接