PhoneGap内存管理

Eri*_*gis 5 javascript memory-leaks memory-management backbone.js cordova

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

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

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

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

小智 3

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

*旧视图 - 视图被导航离开

  • 解除与旧视图关联的所有事件的绑定
  • 从 dom 中删除附加到视图的所有节点,以确保事件也被删除
  • 删除旧的视图对象、模型/集合,以便 DOM 上不再残留任何实例
  • 此外,尽可能多地使用原型,因为通过原型创建的函数仅占用 RAM 空间一次。因此,如果再次创建/启动视图,其关联/子函数将不会再次被推入 RAM
  • 最重要的是,确保“this”指针不会在文件之间的任何地方泄漏。我的一个工作场所曾经在玩了 1.5 小时后陷入困境,经过一周的调试,我们发现 2 个文件/对象/视图之间存在 this 指向的泄漏,这创建了循环引用并使 DOM爆炸。

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

一些有用的链接