Web Worker中ArrayBuffer和Blob对象的内存占用相关问题咨询
问题1解答
- 你存储的所有
ArrayBuffer块确实全部保存在内存中。ArrayBuffer本身就是JS中用于表示通用原始二进制数据缓冲区的对象,分配的是浏览器进程的堆内存空间,数组累计总大小达到2GB就会占用2GB的对应内存。 - 是的,你无法存入超过设备可用内存的容量,而且实际上限比设备物理内存还要低:一方面不同浏览器对单个标签页/Worker进程有独立的内存上限限制(比如Chrome桌面端单渲染进程默认上限通常在4GB以内,移动端会更低),另一方面系统本身还要给其他应用、浏览器其他进程预留内存,超过上限后浏览器会直接抛出内存不足(OOM)错误,甚至直接崩溃终止当前标签页进程。
问题2解答
不会额外占用2GB内存。Blob的底层实现采用了引用计数+数据块共享的机制:new Blob(array)并不会对传入的所有ArrayBuffer执行深拷贝,只是会存储这些二进制块的引用,同时标记自身为不可变对象。只要你后续不修改原有的ArrayBuffer内容,这部分内存是和原数组共享的,只有额外的少量元数据占用新的内存空间。
补充说明:如果你后续修改了原ArrayBuffer的内容,浏览器才会触发写时复制机制(Copy-on-Write),为Blob单独复制一份被修改的块数据,避免影响Blob的不可变特性,这种场景才会产生额外的内存开销。
额外提示
你贴出的代码里存在笔误:shunks.length = 0 应该是 array.length = 0,否则你存储数据块的数组永远不会被清空,会持续占用内存。
内容的提问来源于stack exchange,提问作者OULAHTAK
相关产品推荐
相关产品推荐

