js手机内存泄漏

时间:2012-11-05 11:09:30

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

因此,我们的移动网络应用程序中存在内存泄漏。它没有在桌面上看到,但它崩溃移动Safari浏览器(iOS 4,5,6)并崩溃整个Android OS(在版本2.2.x上检查)。

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

我们使用:

  1. headjs(用于装载js)
  2. yepnope(用于css加载)
  3. socket.io
  4. jquery mobile
  5. 所以我有以下问题:

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

2 个答案:

答案 0 :(得分:1)

如果你不小心,

jQ mobile是known to cause leaks。总而言之,我认为您列出的所有4个工具包都可能导致问题,尤其是当您一起使用它们时。
也许你能做的最好的事情就是尽可能地坚持使用一个库,并专注于以泄漏保持在最低限度的方式使用它。移动浏览器的问题在于,有更多的封闭魔法正在进行,而JS引擎并不是那么熟知/尚未理解。如果你曾经为触摸设备编写JS事件委托代码,你必须注意到只有大量的闭包,以及可能无法及时获得GC的DOM引用。你可以做很多事情。

一般情况下,我倾向于避免使用过多的库(我是其中一个人会为了避免使用任何库来实现这一点,所以我可能会受到偏见)。但是你提出过哪种方式:headjs和jQuery以你能想象的方式检查ready事件的倾向的组合可能很麻烦:你是动态加载新元素,你检查一下是否会触发jQ的多次ready次活动?如果确实如此,你几乎肯定会一遍又一遍地绑定相同的处理程序。每个ajax请求也可能触发其他工具包也做同样的事情,这可能会再次触发jQuery,这反过来可能会再次触发其他lib,这... ...你得到了图片。虽然我不是专家,但我的猜测是,一个lib可能触发另一个,反之亦然,导致死锁情况。我基于对我前一段时间遇到的类似问题的模糊回忆,以及你使用各种库动态加载脚本/ CSS的事实,以及jQ没有解除所有{{{{{{{ 1}}听众上次我查了一下。如果我的预感是正确的,你可以使用邪恶的全局变量作为快速修复:

ready

答案 1 :(得分:1)

很酷,你发现了你的问题,但正如Elias所说,尝试减少你使用的框架数量。

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

无需包含冗余功能。

那就是说,我把css加载到最新版本的头部,但老实说,如果你已经使用了jquery&不要使用响应式设计部件,你真的不需要它。

相关问题