使用新图像()时javascript内存泄漏

使用新图像()时javascript内存泄漏,javascript,memory-leaks,image,Javascript,Memory Leaks,Image,我似乎有内存泄漏,这是由于在javascript脚本中使用“new Image()”造成的。如果我在windows资源监视器中查看已使用的物理内存,我会在加载页面时获得预期的内存增加,因为它使用以下方式加载一些相当大的图像: var imgObjs = []; // in for loop i = 0, 1, 2... imgObjs[i] = new Image(); imgObjs[i].onload = function(event) { // image loaded } im

我似乎有内存泄漏,这是由于在javascript脚本中使用“new Image()”造成的。如果我在windows资源监视器中查看已使用的物理内存,我会在加载页面时获得预期的内存增加,因为它使用以下方式加载一些相当大的图像:

var imgObjs = [];

// in for loop i = 0, 1, 2...
imgObjs[i] = new Image();
imgObjs[i].onload = function(event) {
    // image loaded
}
imgObjs[this.img_src].src = this.img_src;
delete galleries[i].pictures.Items[j].prev;
delete galleries[i].pictures.Items[j].next;
我认为当页面被导航离开时,这会自动破坏引用并释放内存,但事实似乎并非如此。取而代之的是,我导航到别处,然后返回到页面,只找到内存斜坡,因为它再次加载图像,而从未释放以前分配的内存。我曾尝试通过将代码放入卸载事件来手动删除引用,但这似乎没有任何区别。变量最初都是用“var”声明的:

// allow garbage collection by removing references
$(window).unload(function() {
    for(var i in imgObjs) {
    imgObjs[i] = null;
    delete imgObjs[i];
}
delete imgObjs

// delete other variables that reference the images
});
有没有人能告诉我哪里出了问题?我认为问题可能与循环引用有关,因为我构建了一个列表类,其中每个项都包含对上一个和下一个图像的引用,但我认为如下所示:

var imgObjs = [];

// in for loop i = 0, 1, 2...
imgObjs[i] = new Image();
imgObjs[i].onload = function(event) {
    // image loaded
}
imgObjs[this.img_src].src = this.img_src;
delete galleries[i].pictures.Items[j].prev;
delete galleries[i].pictures.Items[j].next;

首先关闭,据我所知,当你转到另一个页面时,没有浏览器会因为图像存储在JS数组中而泄漏

如果在domjs之间有循环引用,其中一些javascript引用DOM元素,而DOM元素上的自定义属性又引用同一个javascript对象,那么一些较旧的浏览器就会出现漏洞,但这里的情况并非如此

所以。。。如果你看到的实际上是从一页转到下一页的漏洞,我会感到惊讶。如果您确信是这样的话,那么就创建一个简单的网页,您可以与我们共享,或者创建一个JSFIDLE来显示问题,并告诉我们您正在测试哪个浏览器,以及您是如何测量内存使用情况的,从而确定是否存在泄漏

要想让它真正成为一个漏洞,您必须始终看到内存使用率一次又一次地上升,每次您一次又一次地浏览页面。仅仅因为第二次访问该页时总内存使用量稍高一点,并不意味着您有泄漏。浏览器的某些数据结构会随着使用量的增加而增长(达到一定程度),如基于内存的缓存、会话浏览历史记录等。。。这并不表明存在泄漏

第二关闭,在您展示的数据结构中,我没有看到任何可以说明在旧浏览器中导致泄漏的循环引用类型

第三个关闭时,
delete
操作符用于从对象中删除属性。这就是它的全部目的。请参阅以下文章:并获得更多解释。因此,卸载处理程序中的清理代码未正确使用
delete
。不能使用
delete
删除变量或数组元素。虽然我看不出有什么理由需要这段代码,但如果您打算使用它,它会是这样的:

// allow garbage collection by removing references
$(window).unload(function() {
    for (var i = 0; i < imgObjs.length; i++) {
        imgObjs[i] = null;
    }
    imgObjs = null;
}
//允许通过删除引用进行垃圾收集
$(窗口)。卸载(函数(){
对于(var i=0;i
可能重复您在此处提出的五个问题,但从未接受其中一个作为最佳答案。请修复此问题,否则人们将开始忽略您的问题。不知道这是如何工作的。我现在就这样做。感谢您的反馈。我制作了一个自定义的“CircularListem”类,用于表示图像旋转木马这是我正在做的。我没有发布代码,因为我不知道它会有多大关系,或者我只是误解了一些更基本的东西。我想我会做的是浏览你提供的文章,看看如果我知道发生了什么,我是否能得到更合理的理解和更新。自从发布我发现,按照您的建议将它们设置为null,而不是明显滥用“delete”,似乎可以让浏览器释放内存。在此之前,每次刷新页面时,内存都会以清晰的步骤增加,直到我的4GB内存大部分都已满为止!谢谢您的建议。完全同意!我认为答案必须包含在每本JS书中!