我正在使用Blob下载文件,问题是即使下载文件后,我也希望保留对象URL,而无需在代码库中进行重大更改。

因此,一种选择是不调用URL.revokeObjectURL();
依靠浏览器的垃圾回收器来避免任何内存泄漏是否安全?

我是否总是需要显式调用URL.revokeObjectURL();

最佳答案


createObjectURL大约要做的一件事情是,在与当前全局对象相关联的隐藏Map中,创建创建的Blob URL中的ID到实际Blob的映射。从GC的 Angular 来看,这意味着Blob remains reachable until either the global itself becomes collectible(通常在您离开页面或关闭选项卡时)或吊销映射时(假定是最后一个引用)。

因此,这取决于您认为什么泄漏。它不会在浏览器的生命周期内保持 Activity 状态,而只会在当前页面的生命周期内保持 Activity 状态。如果希望其生存期可能短于当前页面,则需要撤消。

¹并非完全如此,但是在推理可达性时,它可以很好地描述行为。

关于javascript - 我是否总是需要显式调用URL.revokeObjectURL()?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49209756/

10-12 04:36