function f() {
// some code.. then:
var bloburl = URL.createObjectURL(canvasToBlobOutput)
// I could would do the following line, but assume I don't
// imgElement.src = bloburl;
// will this leak memory?
}
如果我要取消注释imgElement.src行,我明白img元素会" hook"内存中的blob对象。但是如果我们像这样运行函数(没有这一行),我没有看到bloburl
无法进行GC的原因?因为我们在函数之后没有引用它。
答案 0 :(得分:1)
字符串不能充当blob的GC边缘,因为可以操纵字符串。因此,必须将blob放入内部注册表,以防止它被GCed,因此可以从生成的blob URI加载它。
想象一下隐藏的Map
实例和URL.createObjectURL
实现为:
function createObjectURL(blob) {
let uri = generateRandomURI()
window._hiddenMap.set(uri, blob)
return uri
}
这样,当有人试图加载该URI时,可以检查内部地图。但是该映射还必须保持blob活着,因为URI可能是该blob的唯一剩余引用。
要删除该gc-edge,您必须撤消URI。