2012-07-02 122 views
2

我注意到,使用firefox几个小时后,它得到更多的2GB的RAM内存。特别是当我用ajax上传器上传大文件(100mb-400mb)时,以及在我打开许多图像(例如网页上的总共16mb图像)时也会发生这种情况。firefox高内存(RAM)使用情况,如何用javascript免费?

问题是,即使上传完成后或关闭图像页后内存没有变得免费,Firefox仍然有2gb的内存。 有没有一种方法从JavaScript使Firefox的内存,例如,当上传完成或图像加载或关闭后?

编辑about:memory: 1,172.03 MB(100.0%) - 明确

├──1,000.00MB(85.32%) - JS

│├────863.97MB( 73.72%) - 仓([系统首席],0x5083000)

││├──819.31MB(69.91%)──串字符

我哪有空字符串字符,我很确定这是在文件被存入内存然后用ajax上传的时候出现的?

编辑2

这里是recrusive功能导致此内存使用情况:

function uploadAjax(file, startByte, index) 
{ 
    if(startByte==0) 
    { 
     $('#progress'+index).html(' ').progressbar("destroy").progressbar(); 
     $('#asyncuploadsingle'+index).attr('disabled', true); 
    } 

    var size  = file.size; 
    var chunkSize = 2097152;//2 megabyte 
    var endByte  = chunkSize + startByte; 
    var isLast  = (size - endByte <= 0); 
    var chunk  = file; 
    var xhr   = new XMLHttpRequest();//prepare xhr for upload 
    var chunkNum = endByte/chunkSize; 

    if(chunkSize == 0)//no divide 
    { 
     chunk = file; 
     isLast = true; 
    } 
    else if(file.mozSlice) // moz slice 
    { 
     chunk = file.mozSlice(startByte, endByte); 
    } 
    else if(file.webkitSlice) //webkit slice 
    { 
     chunk = file.webkitSlice(startByte, endByte); 
    } 
    else if(file.slice) // w3c slice 
    { 
     chunk = file.slice(startByte, chunkSize); 
    } 
    else 
    { 
     chunk = file; 
     isLast = true; 
    } 

    //progress function, with ajax upload progress can be monitored 
    xhr.upload.addEventListener('progress', function(e) 
    { 
     if (e.lengthComputable) 
     { 
      var perc = Math.round((e.loaded + chunkNum * chunkSize - chunkSize) * 100/size); 
      //console.log(perc+':'+index); 
      $('#progress'+index).progressbar("option", "value", perc); 
     } 
    }, false); 

    xhr.upload.onabort=function(e) { 
     finishUp(index,'Aborted'); 
    }; 

    xhr.upload.addEventListener('error', function(e){ 
     finishUp(index, this.responseText+'--->'+name); 
    }, false); 

    xhr.onreadystatechange=function() 
    { 
     if(this.readyState == 4 && this.status == 200) 
     { 
      try 
      { 
       var ret = JSON.parse(this.responseText); 

       if(isLast) 
       { 
        finishUp(index,''); 
       } 
       else if(ret.status == 'error') 
       { 
        throw ret.info; 
       } 
       else 
       { 
        uploadAjax(file, endByte, index); 
       } 
      } 
      catch(err) 
      { 
       finishUp(index, err); 
      } 

      delete chunk; 
     } 
    }; 

    var path = get_final_path(); 
    var url  = "filetransfer/uploadfiles.php?ax-file-name="+encodeURIComponent(file.name)+"&ax-file-path="+encodeURIComponent(path)+'&ax-start-byte='+startByte; 

    xhr.open("POST", url, true); 
    xhr.setRequestHeader('Cache-Control', 'no-cache'); 
    xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');//header 
    xhr.setRequestHeader('Content-Type', 'application/octet-stream');//generic stream header 

    /*var reader = new FileReader(); 
    reader.onload = function(evt) { 
     xhr.sendAsBinary(evt.target.result); 
    }; 
    reader.readAsBinaryString(chunk); 
    */ 
    xhr.send(chunk); 

    return xhr; 
} 

在任何点处,以优化它或在释放对象?

+0

你试过关闭标签?什么版本? – nhahtdh

+2

不幸的不是。你可以访问'about:memory',但就是这样。 –

+0

Ajax文件上传器?现在这听起来非常有趣(在这里讽刺)。至于你的问题:不可能的。 – freakish

回答

1

这不是你想要的,但听起来好像这是你需要的东西:

https://addons.mozilla.org/en-US/firefox/addon/memory-restart/

您可以为警报设置的阈值,甚至让它自动重启。 (虽然,我刚刚发现了Rob W的提供,about:memory允许你垃圾收集和做其他内存清理(至少在Firefox 13中;没有检查过它有多远,因为我没有以前版本的Firefox在这台机器上,我没有真正的时间来下载和安装以前的版本进行测试)相当整洁如果Firefox自动重新启动,您可能想先尝试使用它,即使它不是自动的是不是你喜欢的。)

+0

现在这个问题是,我正在开发这个上传者和一些Web应用程序,我不希望这个问题发生在客户端浏览器,而不是我的。 – albanx

2

我使用Memoryfox插件来保持firefox的内存降到最低。虽然我只在浏览器中使用它(不启用“所有进程”选项),因为我经常运行Photoshop/Lightroom,并且它在所有进程模式(它非常具有侵略性)时会干扰它们。

Memory Fox

但即使与火狐仍然会膨胀。最好的办法是删除你不使用的任何插件,并禁用那些你不经常使用的插件。如果你有很多插件,有一些会导致firefox出现重大内存问题,其中一些在MemShrink project下突出显示。

具体就在您的编辑提供的代码参照,有几个原因,你可能会看到更多的内存使用情况:

1)使用匿名函数意味着一个新的功能,在内存中创建每次运行uploadAjax时,都会为每个人提供一次。在uploadAjax之外定义你的函数,然后引用它们以避免内存中的重复。

2)delete xhr;当你完成它。这通常不是必需的,但如果你执行了很多上传,它可能会留下一些东西。

3)您实质上是在递归调用uploadAjax(file, endByte, index);并且在匿名函数中,这意味着在较低级调用中执行时,您在较高级调用中创建的所有内容都可能仍然存在。这将导致多个内存中的xhrchunk。考虑以不同的方式调用uploadAjax(比如触发一个事件,然后从全局或者短定时器访问同一个文件和xhr,以引入一个执行断开连接)。我可能会赞成前者,但很难说肯定没有自己测试它)。

+0

问题是我正在开发这个上传器,我不希望这发生在客户端浏览器,而不是我的。 – albanx

+0

哦,这很好。看起来它甚至集成了我在答案中提到的“about:memory”中的那些函数。 – JAB

+0

对于客户端浏览器中的内存使用情况,您无能为力,这取决于他们如何管理内存。在浏览器中运行的范围意味着你必须与他们的浏览器一起生活。然而,您可以在自己的上传器脚本中采取各种步骤进行清理。确保你明确地删除你不再需要的任何东西,这样你就不会留下垃圾来让GC错过。 –

0

这是Firefox后面发生的最糟糕的事情......我也曾经遇到这个问题。问题是你必须重新启动你的浏览器,所以一些内存将是免费的,但不是全部。 One Page Application的主要问题是主要使用dom替换而不刷新页面。

+0

中增加了与代码相关的详细信息,这些代码严重地影响了我的问题,所以我担心使用我的Web应用程序的用户 – albanx

+0

这是One Page Application的主要问题,解决此问题非常困难。您必须清除您停止使用的所有dom,而不是隐藏并显示。 –

0

Firefox中没有JavaScript API来帮助解决您的问题。 Firefox中的内存使用率是最长的投诉之一,尽管需要做大量工作来改善足迹。您的选项主要限于:

(一)重启火狐为了杀死进程和自由它的分配内存

(b)使用第三方实用工具或插件或者Firefox或Windows来帮助释放一些的使用不同的浏览器,如Chrome浏览器内存

(C),它使用一个过程的每片模型,这有助于缓解内存使用情况的关切

仅供参考 - here's some more info from a Mozilla knowledgebase