JS内存泄漏在移动设备上



因此,我们在移动Web应用程序中有内存泄漏。它没有在台式机上看到,但它会崩溃移动野生动物园浏览器(iOS 4、5、6),并崩溃了整个Android OS(检查版本2.2.x)。

崩溃通常会在站点打开很长时间时发生。

我们使用:

  1. headjs(用于JS加载)
  2. yepnope(用于CSS加载)
  3. socket.io
  4. jQuery Mobile

所以我有以下问题:

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

JQ Mobile如果您不小心会导致泄漏。总而言之,我认为您列出的所有四个工具包都可能引起问题,尤其是当您一起使用它们时。
也许您能做的最好的事情是尽可能地坚持使用一个Lib,并以将泄漏保持在最低限度的方式上。移动浏览器的问题在于,正在进行更多的闭合魔术,而JS发动机并不那么众所周知/了解(尚未)。如果您曾经涉足为触摸设备编写JS事件代表团代表代码,则必须注意到,只有大量的封闭量,而DOM引用可能不会及时获得GCED。您对此无能为力。

通常,我倾向于避免使用太多的液体(我是那些会爬行以避免使用任何lib来诚实的人),所以我可能会偏见。但是,您说的是:HeadJs和JQuery倾向于以各种方式检查ready事件的趋势的组合,您可以想象可能会很麻烦:您正在动态加载新元素,是否检查了此元素是否触发了JQ的ready事件是否多次触发?如果是这样,几乎可以肯定,您会一遍又一遍地绑定同一处理者。每个AJAX请求也可能触发其他工具包进行相同的操作,这可能会再次触发jQuery,这又可能会再次触发其他Libs,这是...
您得到了图片。尽管我远非专家,但我的猜测是,一个lib可能会触发另一个自由,反之亦然,从而导致僵局。我基于对我前一段时间遇到的类似问题的模糊回忆,以及您使用各种libs动态加载脚本/CSS的事实,而JQ并没有解除所有ready听众的关闭事实。上次我检查。如果我的直觉原来是,则可以将邪恶的全局变量用作快速固定:

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

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

由于JQ Mobile无论如何都依赖JQuery(因此在您需要时就在那里),因此我强烈建议删除Headjs&amp;是的,并使用jQuery的$ .get()。

加载您的资源

无需包括冗余功能。

也就是说,我将CSS加载添加到了最新版本的Head,但是说实话,如果您已经使用了jQuery&amp;不要使用响应迅速的设计零件,您实际上并不需要它。

最新更新