【发布时间】:2021-04-29 14:55:51
【问题描述】:
为了在我的 js 脚本中获取图像尺寸,我创建了临时的 <img> 元素而不将其附加到 DOM。这是我写的一个函数的简化版本:
function testImage(i) {
let tester = document.createElement('img');
tester.onload = function() { console.log(tester.naturalWidth); }
tester.src = `${i}.jpg`;
}
-
tester仅在函数内部使用。 -
tester永远不会被绑定到 DOM。 - onload 函数与这个
tester有一些关系。我想知道它是否会干扰垃圾收集器。
假设这可以被调用很多很多次。那些测试人员会消耗内存吗?或者垃圾收集器会删除它们吗?
PS:控制台for (let k=0; k < 1000000000; k++) { testImage(k) }吞噬了我的全部记忆。
PS2:我知道我可以编写脚本来重用相同的<img> 元素或元素。但我对第一种方法很好奇。
UPD: 正如@rojo 所说,GC 会清理内存,但在我的情况下我没有注意到它,因为:
-
看起来 GC 不会在同步循环中清理内存(至少在浏览器中)。
for (let k=0; k < (1000*1000); k++) { testImage(k) }行会占用大量内存,但是使用setTimeout执行 1000 次测试的 1000 次循环重复并不会消耗太多内存。手动执行不同大小的循环显示循环结束后内存释放。 -
此特定脚本将许多日志写入浏览器控制台。如果控制台是打开的,它会消耗更多的内存来保存日志。当我重写测试器以防止日志记录时,打开控制台的内存消耗减少了,但 GC 的工作方式相同。
【问题讨论】:
-
我推荐阅读Memory Management (MDN)。我认为变量每次都会被删除。
-
“吃掉我的全部记忆”,但它真的会进行垃圾收集吗?
-
@JonasWilms 我认为吃掉大量内存意味着垃圾仍在内存中。
-
是的。但它仍然可以用于垃圾收集,只是 GC 没有循环。大多数浏览器仅在压力下收集(内存已满时)
标签: javascript firefox browser garbage-collection