javascript - PhoneGap 内存管理

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

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

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

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

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

最佳答案

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

*旧 View - View 被导航走

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

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

一些有用的链接

关于javascript - PhoneGap 内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18911683/

相关文章:

c - 我需要释放固定长度的字符数组吗?

javascript - 如何从 js 文件(使用 ASP.NET MVC 5、Kendo-UI)访问部分 View 中的元素(通过 AJAX 调用加载)?

Javascript - 创建和销毁 toast 消息

javascript - 未捕获的 TypeError : this. getKeyCode 不是函数

javascript - 为 RESTful JSON API 构建 Backbone.js 用户模型、集合和 View

c++ - 是否可以在其范围之外访问局部变量的内存?

javascript - 视频播放器|改变语言和质量

javascript - 客户端javascript与服务器node.js通信的简单方法

javascript - 如何在其他功能中重定向到 Backbone 路由器

objective-c - 如何追踪内存峰值? (这是带有 p 的峰,而不是 l。)