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

时间:2017-06-13 20:53:30

标签: google-chrome memory v8

我在AudioBuffer中加载了两个300MB的MP3文件,然后继续将它们编码为WAV文件。在编码过程的某个地方(发生在Web工作者中),浏览器由于内存不足而崩溃。

Chrome crash

WAV文件大约是MP3文件的3倍,因此转换需要大约1.8GB的额外空间。

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

我会将用户限制为特定项目(所有文件组合)的大小,但似乎最大内存限制因操作系统,操作系统体系结构,浏览器版本和浏览器体系结构而异,因此几乎不可能定义此类限制。

1 个答案:

答案 0 :(得分:1)

不幸的是,没有办法“捕获并处理”内存不足错误,抱歉。根据设计,出于安全原因,当V8无法分配所需的内存时,V8总是会崩溃。

JavaScript堆的内存限制是根据计算机具有的物理内存量动态确定的。几年来,给定“足够”的RAM,在32位桌面架构上为700 MB,在64位架构上为1400 MB;然而,最近版本的Chrome / V8一直在调整策略,现在64位上限为2048MB。所以,是的,细节可以随着时间的推移而改变。但操作系统并不重要(至少不适用于JavaScript堆)。

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

请注意,您可能无法使用最后一个字节达到该最大值。一些内存用于内部元数据;当你动态地增长阵列等时,它们会以块的形式增长,这使得即使增长前的大小不是“最大减去1”,尝试增长的可能性也会达到极限。在32位平台上,尝试分配单个大对象也可能由于地址空间耗尽而失败:在为此分配了一些随机选择的页面之后以及在该过程的整个生命周期中,可能根本没有足够的大块连续的地址空间块可用于分配数百兆字节的大对象,即使尚未达到堆限制。

旁注:“三倍大”?对于常用的MP3比特率,我希望WAV文件最多可达10倍。