JavaScript, почему window.URL.createObjectURL нужно отозвать?
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 "зацепит" объект blob в памяти. Но если бы мы запустили функцию как есть (без этой строки), я не вижу причины, по которой bloburl
не может быть GCed? поскольку у нас нет ссылки на него после функции.
1 ответ
Строка не может выступать в качестве GC-края для BLOB-объекта, поскольку строками можно манипулировать. Следовательно, большой двоичный объект должен быть помещен во внутренний реестр, чтобы предотвратить его GCed, чтобы он мог быть загружен из созданного URI большого двоичного объекта.
Представь, что там скрыто Map
экземпляр и URL.createObjectURL
реализовано как:
function createObjectURL(blob) {
let uri = generateRandomURI()
window._hiddenMap.set(uri, blob)
return uri
}
Таким образом, внутренняя карта может быть проверена, когда кто-то пытается загрузить этот URI. Но эта карта также должна поддерживать большой двоичный объект, потому что URI может быть единственной оставшейся ссылкой на этот большой двоичный объект.
Чтобы удалить этот gc-edge, вы должны отозвать URI.