2012-07-02 55 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