2011-02-04 71 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(); 

达到这个目的,内存被清除。

不幸的是,我没有找到一种方法来与图像做到这一点,如果发现我很想知道。