Javascript 移动设备上的js内存泄漏

Javascript 移动设备上的js内存泄漏,javascript,jquery,jquery-mobile,memory-leaks,socket.io,Javascript,Jquery,Jquery Mobile,Memory Leaks,Socket.io,因此,我们的移动web应用程序中存在内存泄漏。在桌面上看不到它,但它会使移动Safari浏览器(iOS 4、5、6)崩溃,并使整个Android操作系统崩溃(在版本2.2.x上检查) 崩溃通常发生在站点长时间处于打开状态时 我们使用: headjs(用于js加载) yepnope(用于css加载) socket.io jquerymobile 因此,我有以下问题: 下列哪些库可能导致内存泄漏 我们是应该检查使用jquery选择器的代码,还是应该检查 应该小心使用socket.io吗 如果我们加载

因此,我们的移动web应用程序中存在内存泄漏。在桌面上看不到它,但它会使移动Safari浏览器(iOS 4、5、6)崩溃,并使整个Android操作系统崩溃(在版本2.2.x上检查)

崩溃通常发生在站点长时间处于打开状态时

我们使用:

  • headjs(用于js加载)
  • yepnope(用于css加载)
  • socket.io
  • jquerymobile
  • 因此,我有以下问题:

  • 下列哪些库可能导致内存泄漏
  • 我们是应该检查使用jquery选择器的代码,还是应该检查 应该小心使用socket.io吗
  • 如果我们加载脚本,脚本加载程序(headjs,yepnop)会导致内存泄漏吗 其中有20多个短脚本
  • 如果你不小心的话,jQ移动就是。总而言之,我认为您列出的所有4个工具包都可能导致问题,尤其是当您同时使用它们时
    也许你能做的最好的事情就是尽可能地坚持使用一个库,并将重点放在使用它的方式上,使泄漏保持在最低限度。移动浏览器的问题在于有更多的闭包魔法在进行,而JS引擎还不是那么广为人知。如果您曾经涉猎过为触摸设备编写JS事件委派代码,那么您一定已经注意到,有大量的闭包和DOM引用可能无法及时得到GC。你对此无能为力

    一般来说,我倾向于避免使用太多的lib(老实说,我是那种会爬到火边避免使用任何lib的ppl之一),所以我可能会有偏见。但不管你怎么说:headjs和jQuery的组合倾向于以你能想象的所有方式检查
    ready
    事件,这可能会很麻烦:你正在动态加载新元素,你有没有检查过这是否会多次触发jQ的
    ready
    事件?如果是这样的话,几乎可以肯定的是,您会一次又一次地绑定相同的处理程序。每个ajax请求也可能触发其他工具包来做同样的事情,这可能再次触发jQuery,而jQuery又可能再次触发其他lib,这
    你明白了。虽然我远非专家,但我猜测一个lib可能触发另一个lib,反之亦然,从而导致死锁场景。我对不久前遇到的一个类似问题有一个模糊的回忆,事实上您正在使用各种lib动态加载脚本/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
    });
    
    var jQReady=false;
    jQuery(document).load(function()
    {
    如果(jQReady==true)
    {//已加载
    返回;
    }
    
    jQready=true;//发现问题很酷,但正如Elias所说,尝试减少使用的框架数量

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

    不需要包括冗余功能


    也就是说,我将css加载添加到了最新版本的head中,但老实说,如果您已经使用jquery&不使用响应设计部分,您就不需要它了。

    我假设代码太大,无法在问题或小提琴中发布,那么链接如何?桌面机器上是否有任何减速?有很多方法可以改进pejquery的性能,如缓存选择器等,其原因实际上是在socket.io中。但是在您的评论之后-我已经将一些匿名函数移动到了命名函数,并跟踪了许多可能存在重复闭包的地方。谢谢。我更愿意删除jquery并留下head.js:)