【问题标题】:Chrome Memory/Garbage Collection IssueChrome 内存/垃圾收集问题
【发布时间】:2011-02-04 22:26:46
【问题描述】:

我在使用 Chrome 时遇到内存/垃圾收集问题

我正在开发一个照片上传网站,它允许我的客户拖放照片以使用 HTML5 和文件 API 上传,所以这在 IE 中不起作用。它仅适用于 Chrome 和 FF。我还没有在 Safari、Opera 中测试过。

我没有使用任何 JS 框架,而且我的示例代码不到 80 行,因此非常容易上手。

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

如果您将少量 JPG 照片(每张 4-5MB)拖放到框中,您将看到预览加载,并且在 Windows 任务管理器中,您可以看到该窗口的内存使用量攀升。如果单击“清除图像”按钮,图像将被删除。

如果您在 FF 中执行此操作,几秒钟后,内存将恢复到您预览图像之前的状态。但是在 chrome 中,内存并没有下降。

有什么想法吗?我做错了什么还是这是一个 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()"/>

【问题讨论】:

  • 在此处发布您的代码。 SO 有 10% 的用户在 iOS 上看不到它。
  • 继 Radek 的评论之后,StackOverflow 应该是独立的。可以删除或移动外部链接。一般而言,人们不应该去其他地方阅读您的问题。
  • 你在哪里移除事件监听器?仅仅因为你从 DOM 中移除了一个元素并不意味着所有的事件都会被抛出。

标签: javascript memory google-chrome garbage-collection


【解决方案1】:

是的,这对我来说也是个大问题,
现代浏览器似乎没有释放资源,尤其是图像。考虑到大量的 Ajax 页面、保持状态以及允许用户不刷新页面,我认为这应该是一个重点。

幸运的是,对于 HTML5 视频,您可以通过首先更改 src 来实现这一点

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

如果您在删除视频元素之前执行此操作,则会清除内存。

很遗憾,我没有找到使用图像的方法,如果找到了,我很想知道。

【讨论】:

    【解决方案2】:

    看来你是对的,我相信任何 DOM 删除都会发生这种情况,Chrome 中的内存不会被释放。 Canvas 也会发生同样的事情:

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

    也许您可以提交错误报告 (http://crbug.com/new),然后,我会抄送相应的团队进行更多分类。

    谢谢!

    【讨论】:

    【解决方案3】:

    显然,这已在最新版本的 chromium 中得到修复(至少是视频内存泄漏)。

    修复可以在 chrome 49 中找到,我相信这是修复它的确切提交:https://chromium.googlesource.com/chromium/src/+/d13710832e9d0e6302cf8388cda94a7a780d8664%5E%21/#F0

    这意味着不再需要源代码破解。

    【讨论】:

    • 很高兴看到您抽出时间为一个老问题提供答案。尽管假定的修复可能有助于解决问题 - 始终最好在您的答案中包含修复/解决方案的关键方面,以便即使链接断开,您的答案仍然有用。
    • 嘿@ishmaelMakitla 修复隐含在铬中,它只是意味着问题不应该再发生了。该链接仅供参考,以供您进行额外调查。
    猜你喜欢
    • 2012-11-05
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 2011-02-23
    • 2011-06-03
    • 1970-01-01
    相关资源
    最近更新 更多