Cordova/Knockout/jQueryMobile 缓存内存性能

Posted

技术标签:

【中文标题】Cordova/Knockout/jQueryMobile 缓存内存性能【英文标题】:Cordova/Knockout/jQueryMobile cache memory performance 【发布时间】:2015-09-02 19:48:33 【问题描述】:

我正在使用 Knockout 和 jQueryMobile 编写一个我正在使用 Cordova 发布的应用程序。我编写了一个轻量级框架,用于混合 ko 视图模型和 jqm 页面元素。所有可观察对象都在视图模型对象中,在页面更改时为空,并且页面的所有 ui 定义都使用“with”或“模板”绑定,以便在 jqm 交换页面之前清除它自己的侦听器并删除页面的内部 dom 内容.这样,没有绑定是长期存在的,并且应该根据需要释放 dom。

在使用 chrome 调试器工具分析堆时,我仍然看到在导航应用程序时有数十到数百兆字节的累积泄漏。大多数(全部?)泄漏的对象是(或正在挂起的)分离的 dom 节点,这些节点只能从 jquery 缓存中访问。为了提高性能,我会接受内存命中,但是,用户抱怨移动设备的速度随着使用应用程序的时间长度而增加。

我很想简单地使用不同的 ui 库并完全删除 jquery,但这不是一个选项。

    有没有办法禁用 jquery 缓存? 有没有办法手动清除 jquery chache? 还有其他建议吗?

编辑:经过更多研究,似乎问题与让淘汰赛处理 dom 操作有关。 jQuery 现在持有缓存的事件侦听器,因为它不知道附加到事件的节点现在已与 DOM 分离。具有讽刺意味的是,我的架构最近围绕敲除保持对分离节点的引用的反向情况进行了重组。似乎高级答案仍然是“永远不要使用两个操纵 DOM 的库”,但我会继续努力寻求一个不那么激进的解决方案。

【问题讨论】:

【参考方案1】:

文档说只需将其设置为 false:

$.mobile.page.prototype.options.domCache = false;

http://demos.jquerymobile.com/1.0.1/docs/pages/page-cache.html

仅供参考 - 它们不是分离的 DOM 节点,它们实际上仍在 DOM 中。

【讨论】:

感谢您的回答。如当前版本的文档中所示,此选项默认设置为 false,如果您确实希望保留未显示页面的 DOM 对象,则可以启用:demos.jquerymobile.com/1.4.5/pages。默认情况下,未显示的页面将从 DOM 中删除。我的问题是仍然可以从 jquery 的缓存中访问分离的 dom 节点。 您可以通过登录 $.cache 直接查看您的缓存 - 每当我在文档站点上加载页面并查看 $.cache 时,它在当前页面上有一堆元素,但它是在页面导航之间清除。

以上是关于Cordova/Knockout/jQueryMobile 缓存内存性能的主要内容,如果未能解决你的问题,请参考以下文章