如何捕获和处理 Chrome 内存崩溃?

How to catch and handle Chrome memory crash?

我正在 AudioBuffer 中加载两个 300MB 的 MP3 文件,然后继续将它们编码为 WAV 文件。在编码过程中的某处(发生在 web worker 中),浏览器因内存不足而崩溃。

WAV 文件大约是 MP3 文件的 3 倍,因此需要额外约 1.8GB space 来进行转换。

文件可以有任何大小,因为它们是用户选择上传的mp3文件,所以可以是10MB或350MB。这意味着内存可能足够也可能不够。如果这还不够,我如何简单地捕获并处理错误而不是让浏览器崩溃?

我会将用户限制为特定项目(所有文件合并)的大小,但最大内存限制似乎因 OS、OS 架构、浏览器版本和浏览器架构而异这使得几乎不可能定义这样的限制。

很遗憾,无法 "catch and handle" 内存不足错误,抱歉。根据设计,出于安全原因,V8 总是在无法分配所需内存时使进程崩溃。

JavaScript 堆的内存限制是根据机器拥有的物理内存量动态确定的。多年来,给定 "sufficient" RAM,在 32 位桌面架构上为 700 MB,在 64 位架构上为 1400 MB;然而,Chrome/V8 的最新版本一直在调整策略,上限现在是 64 位上的 2048MB。所以是的,具体细节会随着时间而改变。不过 OS 并不重要(至少对于 JavaScript 堆而言)。

我不完全确定 AudioBuffers 是否计入 V8 的堆限制(V8 本身不知道 AudioBuffers,它们是由嵌入器实现的,即 Blink)。

请注意,您可能无法使用不超过该最大值的每个最后一个字节。一些内存用于内部元数据;当您动态地增长数组等时,它们会成块增长,这使得即使增长前的大小不是 "maximum minus one",尝试增长也可能达到极限。在 32 位平台上,尝试分配单个大对象也可能由于地址 space 耗尽而失败:在进程的生命周期内为此和那个分配了一些随机选择的页面之后,可能只是不是足够大的连续地址块 space 可用于分配数百兆字节的大对象,即使尚未达到堆限制也是如此。

旁注:"three times larger"?对于常用的 MP3 比特率,我希望 WAV 文件大 10 倍。