【发布时间】:2013-09-25 12:59:51
【问题描述】:
几个月来,我一直在使用PhoneGap 2.8 开发一个Android 应用程序,在javascript 方面,我使用Backbone 和jQuery 作为我的主要框架。随着我的应用程序增长到合理的大小,我开始注意到相当大的内存消耗。在阅读了解释为什么PhoneGap 需要大量内存才能运行的不同文章后,我仍然相信我可以对内存使用方式进行一些优化。
在BackBone 中,我们有一个Router 对象,它将URI-s 映射到特定函数,这为我呈现了一个称为View 对象的东西。我不仅实现了我的路由器功能来创建一个视图并渲染它,而且我还存储了对当前正在显示的视图的全局引用。所以在创建新视图之前,我告诉旧视图进行一些清理(这是递归完成的,因为视图可以包含更多“子”视图)。在清理下,我目前告诉 view 取消对他的事件的委托(我相信 Backbone 删除了事件侦听器)。目前没有做更多的事情。渲染新视图后,全局变量将引用新视图。我相信 javascript GC 会释放旧视图使用的内存。唉,我不知道这种情况正在发生——我在我的应用程序中浏览的越多,内存消耗的就越多。我知道有一些内存泄漏正在发生,但我无法弄清楚它是什么,这需要内存。我怀疑的一件事是旧对象由于某种原因没有被正确收集。我怀疑一旦我在某个容器上呈现新的 html (DOM),可能旧的 DOM 会导致内存泄漏,也许某些事件处理程序被不必要地存储在某处。
我想知道的是,是否有任何工具、命令或提示可以帮助我调试/跟踪/测量内存分配的位置。有没有办法访问所有事件侦听器并以某种方式测量它们(对于 DOM 也是如此)。任何有关智能内存高效技术的文章也将不胜感激。目前我唯一能做的就是开始递归地删除我愿意销毁的对象的所有属性(最后也是对象)。
非常欢迎任何建议! 先感谢您。
【问题讨论】:
-
因为我使用 jQuery 通过 .html(data) 函数向 DOM 添加内容,所以我读到调用 .empty().html(data) 是一个更好的选择,因为 empty() 删除了移除 DOM 元素之前的事件处理程序和所有文本。读完之后,我在所有的 .html() 调用中添加了 empty() ,但我没有注意到相当大的改进。我还是相信问题的根源是可以找到的。
-
Chrome 有一个可与 ADB 一起使用的扩展程序,但我认为它仅适用于 Chrome 而不是原生 Android 浏览器(在 WebView 中使用)developers.google.com/chrome-developer-tools/docs/…。 Paul Irish 建议了一份您可以使用的工具列表:plus.google.com/+PaulIrish/posts/ccP98BTMd5Z。我以前用过weinre,但它不做分析。 jsHybugger 或许能帮到你。
-
我已经尝试过 jsHybugger,我真的很喜欢它目前提供的功能。 jsHybugger 的开发人员告诉我,他很快将发布一个版本,其中包括时间轴选项卡功能以及查看内存中当前的 javascript 对象(正是我需要的)。换句话说,jsHybugger 是一个非常实用的 phonegap 开发工具,我推荐给大家。
-
jsHybugger和Android上远程调试Chrome有区别吗? developers.google.com/chrome-developer-tools/docs/…
标签: javascript backbone.js memory-management memory-leaks cordova