2011-02-04 118 views
2

我有Chrome的Chrome的內存/垃圾收集問題

我工作的一個照片上傳網站,讓我的客戶拖放照片使用HTML5和文件API上傳,所以這個內存/垃圾收集問題不會在IE中工作。它只適用於Chrome和FF。我還沒有在Safari,Opera中測試過。

我沒有使用任何JS框架,我的示例少於80行代碼,所以它很容易遵循。

這是我的例子:http://seesquaredphoto.com/testPreview.html

如果拖放的JPG照片屈指可數(4-5MB每個)入禁區,你會看到預覽負載,並在Windows任務管理器,你可以看到內存該窗口的使用率攀升。如果您單擊「清除圖像」按鈕,圖像將被刪除。

如果在FF中執行此操作,幾秒鐘後,內存將返回到您預覽圖像之前的狀態。但是在Chrome中,內存不會下降。

任何想法?我做錯了什麼或者這是一個鉻錯誤?

謝謝。 下面是代碼,如果你不想要查看源代碼上面的鏈接:

的Javascript

var upload = {   
    uploadFiles : function(event) { 
     var files = event.dataTransfer.files; 
     event.stopPropagation(); 
     event.preventDefault(); 

     var imageType = /image.*/; 
     for (var x = 0; x < files.length; x++) { 
      var file = files.item(x); 
      if (!file.type.match(imageType) || file.fileName.toUpperCase().indexOf(".JPG")!=file.fileName.length-4) { 
       continue; 
      }  

      var s = document.createElement("span"); 
      s.className = "imgS"; 
      var img = document.createElement("img"); 
      img.className = "preview"; 
      img.src = ""; 

      s.appendChild(img); 
      document.getElementById("DDCont").appendChild(s); 
      loadPreview(img,file); 
     } 
    } 
}; 
function loadPreview(img,file){ 
    var reader = new FileReader(); 
    reader.onload = function(e) { 
     img.src = e.target.result; 
    } 
    reader.readAsDataURL(file) 
} 
function init(){ 
    var container = document.getElementById('DDCont'); 
    container.addEventListener("dragenter", function(event) { 
      event.stopPropagation(); 
      event.preventDefault(); 
     }, 
     false 
    ); 
    container.addEventListener("dragover", function(event) { 
      event.stopPropagation(); 
      event.preventDefault(); 
     }, 
     false 
    ); 
    container.addEventListener("dragleave", function(event) { 
      event.stopPropagation(); 
      event.preventDefault(); 
     }, 
     false 
    ); 
    container.addEventListener("drop", upload.uploadFiles, false); 
} 
function clearImages(){ 
    cont = document.getElementById("DDCont"); 
    while(cont.childNodes.length>0) { 
     cont.removeChild(cont.childNodes[0]); 
    } 
} 

HTML:

<div id="DDCont" style="width:800px; height:600px; border:3px solid #333333; overflow:auto;"></div> 
<input type="button" value="Clear Images" onclick="clearImages()"/> 
+1

在這裏發佈您的代碼。 SO的用戶中有10%在iOS上,無法看到它。 – 2011-02-04 22:29:38

+0

從Radek的評論開始,StackOverflow應該是獨立的。外部鏈接可以被刪除或移動。一般來說,人們不應該去其他地方閱讀你的問題。 – 2011-02-04 22:31:33

+0

你在哪裏刪除事件監聽器?僅僅因爲你從DOM中刪除一個元素並不意味着所有的事件都被拋出。 – rxgx 2011-02-11 21:54:07

回答

0

看來你的權利,我相信它發生任何DOM刪除,內存不會在Chrome中釋放。同樣的事情發生與帆布:

http://code.google.com/p/chromium/issues/detail?id=40178

或許你可以提交錯誤報告(http://crbug.com/new),並且你做到這一點後,我將抄送相關小組,以更優先分配。

謝謝!

3

是的,這對我來說也是一個大問題,
看來,現代瀏覽器不釋放資源,特別是與圖像。我認爲這應該是一個焦點,考慮到大量的Ajax頁面,保持狀態,並允許用戶不刷新頁面。

幸運的是,隨着HTML5的視頻,您可以通過如果你刪除視頻元素之前做到這一點首先改變SRC

video.src=" "; 
video.load(); 

達到這個目的,內存被清除。

不幸的是,我沒有找到一種方法來與圖像做到這一點,如果發現我很想知道。