PhoneGap 内存管理

5
几个月来,我一直在使用PhoneGap 2.8开发一个安卓应用程序,我在JavaScript方面使用BackbonejQuery作为我的主要框架。随着我的应用程序逐渐增大,我开始注意到它的内存消耗相当大。尽管阅读了许多解释为什么PhoneGap甚至需要大量内存才能运行的文章,但我仍然相信我可以优化内存使用方式。
BackBone中,我们有一个路由对象将URI映射到特定函数,该函数呈现称为视图View对象的东西。我不仅实现了我的路由器函数来创建并呈现一个视图,而且还全局存储当前显示视图的引用。因此,在创建新视图之前,我告诉旧视图进行清理(这是递归进行的,因为视图可以包含更多的“子”视图)。目前只执行视图取消委托其事件的操作(我信任Backbone会删除事件侦听器)。然后释放旧视图所使用的内存。但是,我发现越来越多的内存被使用了。我知道可能存在一些内存泄漏,但我无法弄清楚是什么导致内存泄漏。我怀疑旧对象由于某种原因没有被垃圾回收。我怀疑一旦我在某个容器中渲染新的HTML(DOM),也许旧的DOM会导致内存泄漏,可能是某些事件处理程序被不必要地存储在某个地方。
我希望知道是否有任何工具、命令或提示可以调试/跟踪/测量内存分配的位置。是否有一种方法可以访问所有事件侦听器并对它们进行测量(DOM也是如此)。欢迎提供任何内容智能内存高效技术的文章。目前,我所能想到的唯一做法是开始递归删除我愿意销毁的对象的所有属性(最后是对象本身)。
非常感谢您提供的任何建议!

由于我使用jQuery通过.html(data)函数向DOM添加内容,我已经阅读到调用.empty().html(data)是更好的选择,因为empty()删除DOM元素之前的所有文本和事件处理程序。 在阅读了这一点之后,我已将empty()添加到所有我的.html()调用中,但我没有注意到显着的改进。 我仍然相信问题的根源有待发现。 - Erich Jagomägis
Chrome有一个与ADB一起使用的扩展,但我认为它只适用于Chrome而不是原生Android浏览器(在WebView中使用)。Paul Irish建议了一些工具列表,您可能会用到:https://plus.google.com/+PaulIrish/posts/ccP98BTMd5Z。我以前使用过weinre,但它不能进行分析。jsHybugger可能能够帮助您。 - j03w
我已经尝试过jsHybugger,我真的很喜欢它目前提供的功能。jsHybugger的开发者告诉我,很快他将发布一个版本,其中将包括时间轴选项卡功能以及查看内存中当前的javascript对象(正是我所需要的)。换句话说,jsHybugger是一个非常有用的PhoneGap开发工具,我向每个人推荐它。 - Erich Jagomägis
jsHybugger和在Android上远程调试Chrome之间有区别吗? - TWilly
1个回答

3

我在我的第一个PhoneGap应用程序中也遇到了类似的问题。我们采用了一些技巧,包括:

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

  • 解除与旧视图关联的所有事件。
  • 从DOM中删除附加到该视图的所有节点,以确保事件也已被移除。
  • 删除旧视图对象、模型/集合,以便在DOM上不留下任何实例。
  • 此外,请尽可能多地使用原型,因为通过原型创建的函数只会占用RAM中的空间一次。因此,如果重新创建/初始化视图,其关联/子函数不会再次推入RAM中。
  • 最重要的是,确保'this'指针没有泄漏到文件之间的任何位置。我的一个工作场所在玩1.5小时后经常卡住,在调试了一个星期之后,我们发现在2个文件/对象/视图之间存在this指针泄漏,这创建了一个循环引用并使DOM爆炸。

另外,您可以尝试使用Google Chrome的分析工具。

一些有用的链接


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接