首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >加载图像时内存泄漏

加载图像时内存泄漏
EN

Stack Overflow用户
提问于 2016-04-18 13:38:29
回答 3查看 1.3K关注 0票数 0

我使用下面的代码来加载和调整图像的大小。

代码语言:javascript
运行
复制
$(imagesToProcess.files).each(function (idx, file) {
                    var img = new Image();
                    img.onload = function (e) {
                        //var resized = _resizeImage(e.target);
                        URL.revokeObjectURL(e.target.src);
                    };
                    img.src = URL.createObjectURL(file);
                });

这段代码在Chrome中产生了一个巨大的内存峰值,尽管我将实际的调整大小排除在外。我做错了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-04-18 16:52:58

这个基于this answer的代码为我解决了这个问题

代码语言:javascript
运行
复制
                    var fileQueue = [];
                    var lock = false;
                    var img = new Image();
                    img.onload = function (e) {
                        URL.revokeObjectURL(e.target.src);
                        lock = false;
                    };

                    $(imagesToProcess.files).each(function (idx, file) {
                        fileQueue.push(file);
                    });

                    var processQueue = setInterval(processFile, 250);

                    function processFile() {
                        if (fileQueue.length == 0) {
                            console.log('nothing in queue');
                            clearInterval(processQueue);
                            return;
                        }
                        if (!lock) {
                            img.src = URL.createObjectURL(fileQueue.shift());
                            lock = true;
                        }
                    }
票数 1
EN

Stack Overflow用户

发布于 2016-04-18 13:49:55

不要使用太多的匿名函数,而是使用函数的引用。

代码语言:javascript
运行
复制
$(imagesToProcess.files).each(createImage);

function createImage(idx, file){
   var img = new Image();
       img.onload = imageOnload;
       img.src = URL.createObjectURL(file);
}
function imageOnload(e) {
    URL.revokeObjectURL(e.target.src);
}

在您为每个图像创建的代码中,创建了一个函数对象实例。这就是导致代码中内存泄漏的原因。

票数 0
EN

Stack Overflow用户

发布于 2020-06-25 20:50:34

我最终通过使用jpeg解码的替代方法(使用库而不是浏览器的图像对象)解决了程序中的内存泄漏:https://stackoverflow.com/a/62584068/2441655

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36695655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档