5

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

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

我想知道的是,是否有任何工具、命令或提示可以帮助我调试/跟踪/测量内存分配的位置。有没有办法访问所有事件侦听器并以某种方式测量它们(对于 DOM 也是如此)。任何有关智能内存高效技术的文章也将不胜感激。目前我唯一能做的就是开始递归地删除我愿意销毁的对象的所有属性(最后也是对象)。

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

4

1 回答 1

3

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

*旧视图 - 视图被导航走

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

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

几个有用的链接

于 2013-10-11T15:39:49.437 回答