URL.createObjectURL()是Blob的轻量包装还是持有独立缓冲区副本?
关于
URL.createObjectURL()的内存开销与revokeObjectURL()调用时机的解答 核心结论
URL.createObjectURL()本质是对Blob的轻量引用包装,不会产生额外的大额内存开销,也不会提前解压图片Blob中的压缩数据。
具体细节
- 它仅在浏览器内部创建一个临时URL与Blob的映射关系,这个映射条目的内存占用可以忽略不计——既不会复制Blob的原始压缩数据,也不会触发图片的解压操作。
- 图片的解压(从压缩格式转为位图数据)是在浏览器实际渲染图片时才会发生的:比如将该临时URL赋值给
<img>元素的src属性后,浏览器加载对应Blob数据时才会执行解压,这部分内存由渲染引擎独立管理,和createObjectURL()本身无关。 - 由于Blob本身是不可变的,
createObjectURL()也不需要为了“防止数据变更”而复制数据,完全依赖原Blob的引用。
对你场景的建议
既然你会在内存中保留Blob,那么完全可以保留createObjectURL()生成的临时URL以备多次复用,不会带来额外的内存负担。只有当你彻底不再需要这个URL(且即使Blob保留也不再需要通过该URL访问它)时,才需要调用revokeObjectURL();如果是循环大量创建URL的场景,才需要及时调用revokeObjectURL()避免映射条目堆积,但你的情况不存在这个问题。
内容的提问来源于stack exchange,提问作者curiousdannii
相关产品推荐
相关产品推荐

