【问题标题】:js memory leak on mobile手机上的js内存泄漏
【发布时间】:2012-11-05 11:09:30
【问题描述】:

所以,我们的移动网络应用程序出现了内存泄漏。它在桌面上看不到,但它会导致移动 Safari 浏览器(iOS 4、5、6)崩溃并导致整个 Android 操作系统崩溃(检查版本 2.2.x)。

当网站长时间打开时,通常会发生崩溃。

我们使用:

  1. headjs(用于 js 加载)
  2. yepnope(用于 CSS 加载)
  3. socket.io
  4. jquery 移动版

所以我有以下问题:

  1. 以下哪些库会导致内存泄漏?
  2. 我们是否应该审查使用 jquery 选择器的代码,或者我们应该 应该小心使用 socket.io 吗?
  3. 如果我们加载脚本加载器(headjs, yepnope),可能会导致内存泄漏 其中包含 20 多个短脚本?

【问题讨论】:

标签: javascript jquery jquery-mobile memory-leaks socket.io


【解决方案1】:

如果你不小心的话,jQ mobile 是known to cause leaks。总而言之,我认为您列出的所有 4 个工具包都可能导致问题,尤其是当您一起使用它们时。
也许您能做的最好的事情就是尽可能地坚持一个库,并专注于以将泄漏保持在最低限度的方式使用它。移动浏览器的问题在于,还有更多的闭包魔法在发生,而且 JS 引擎还没有那么广为人知/理解。如果您曾经涉足为触摸设备编写 JS 事件委托代码,那么您一定已经注意到,闭包数量惊人,并且 DOM 引用可能无法及时被 GC 处理。您对此无能为力。

一般来说,我倾向于避免使用太多的库(老实说,我是那些会爬起来避免使用任何库的人之一),所以我可能会有偏见。但是无论你怎么写:headjs 和 jQuery 以你可以想象的所有方式检查 ready 事件的倾向可能很麻烦:你正在动态加载新元素,你检查过这是否会触发 jQ 的 @987654323 @事件多次?如果是这样,您几乎肯定会一遍又一遍地绑定相同的处理程序。每个 ajax 请求也可能触发其他工具包做同样的事情,这可能会再次触发 jQuery,这反过来又可能再次触发其他库,这...
你明白了。尽管我远非专家,但我的猜测是一个库可能会触发另一个库,反之亦然,从而导致死锁情况。我基于对我不久前遇到的类似问题的模糊回忆,以及您使用各种库动态加载脚本/CSS的事实,以及 jQ 没有解除其所有@987654324 的绑定的事实@listeners 我上次检查时。如果我的预感结果是正确,您可以使用一个邪恶的全局变量作为快速修复:

var jQReady = false;
jQuery(document).load(function()
{
    if (jQReady === true)
    {//was loaded
        return;
    }
    jQready = true;//<-- set to true on first invocation of callback
});

【讨论】:

  • 其实原因在socket.io。但是在您发表评论之后 - 我已将一些匿名函数移至命名函数,并跟踪了很多可能存在重复闭包的地方。谢谢。
【解决方案2】:

您发现了问题真好,但正如 Elias 所说,请尝试减少您使用的框架数量。

由于 JQ Mobile 无论如何都依赖 jQuery(所以当你需要它时它就在那里),我强烈建议删除 HeadJS 和 YepNope,并使用 jQuery 的 $.get() 加载你的资源。

无需包含多余的功能。

也就是说,我在最新版本的 head 中添加了 css 加载,但老实说,如果你已经使用 jquery 并且不使用响应式设计部分,那么你真的不需要它。

【讨论】:

  • 我宁愿删除 jquery 并离开 head.js :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-06
  • 1970-01-01
  • 2013-01-24
  • 2015-10-18
相关资源
最近更新 更多