我使用下面的代码来加载和调整图像的大小。
$(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中产生了一个巨大的内存峰值,尽管我将实际的调整大小排除在外。我做错了什么?
发布于 2016-04-18 16:52:58
这个基于this answer的代码为我解决了这个问题
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;
}
}发布于 2016-04-18 13:49:55
不要使用太多的匿名函数,而是使用函数的引用。
$(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);
}在您为每个图像创建的代码中,创建了一个函数对象实例。这就是导致代码中内存泄漏的原因。
发布于 2020-06-25 20:50:34
我最终通过使用jpeg解码的替代方法(使用库而不是浏览器的图像对象)解决了程序中的内存泄漏:https://stackoverflow.com/a/62584068/2441655
https://stackoverflow.com/questions/36695655
复制相似问题