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

Google chrome 如何捕获和处理Chrome内存崩溃?,google-chrome,memory,v8,Google Chrome,Memory,V8,我在音频缓冲区中加载了两个300MB的MP3文件,然后将它们编码为WAV文件。在编码过程中的某个地方(发生在web worker中),浏览器因内存不足而崩溃 WAV文件大约是MP3文件的3倍大,因此转换需要约1.8GB的额外空间 这些文件可以有任何大小,因为它们是用户选择上载的mp3文件,所以它们可以是10MB或350MB。这意味着内存可能不足,也可能不足。如果这还不够,我如何简单地捕获并处理错误,而不是让浏览器崩溃 我会将用户限制为特定的项目(所有文件的组合)大小,但最大内存限制似乎因操作系

我在
音频缓冲区中加载了两个300MB的MP3文件,然后将它们编码为WAV文件。在编码过程中的某个地方(发生在web worker中),浏览器因内存不足而崩溃

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

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


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

遗憾的是,无法“捕获并处理”内存不足错误,抱歉。根据设计,出于安全原因,V8总是在无法分配所需内存时使进程崩溃

JavaScript堆的内存限制是根据机器拥有的物理内存量动态确定的。几年来,在“足够”的RAM下,32位桌面架构的内存为700MB,64位架构的内存为1400MB;然而,Chrome/V8的最新版本一直在调整策略,目前64位的上限为2048MB。因此,是的,细节会随着时间的推移而改变。不过,操作系统并不重要(至少对于JavaScript堆来说不重要)

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

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


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

遗憾的是,没有办法“捕获并处理”内存不足错误,对不起。根据设计,出于安全原因,V8总是在无法分配所需内存时使进程崩溃

JavaScript堆的内存限制是根据机器拥有的物理内存量动态确定的。几年来,在“足够”的RAM下,32位桌面架构的内存为700MB,64位架构的内存为1400MB;然而,Chrome/V8的最新版本一直在调整策略,目前64位的上限为2048MB。因此,是的,细节会随着时间的推移而改变。不过,操作系统并不重要(至少对于JavaScript堆来说不重要)

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

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


旁注:“三倍大”?对于常用的MP3比特率,我预计WAV文件会大10倍。

这个答案()表明操作系统和浏览器版本会对内存限制产生影响,尽管他可能在谈论整个选项卡内存,而您具体谈论的是JS堆大小。我认为
AudioBuffers
包含在V8的堆中,就像我拍摄“堆快照”时一样。至于WAV编码,我正在转换为一个16位文件,这也许可以解释为什么它只有3-4倍大。我将测试JS堆限制,然后再与您联系。非常感谢你的帮助!我目前有一个工作页面,JS堆大小为1503MB(根据堆快照),这让我相信1400MB不是限制。哈,这是一个很好的观点。事实证明,在Chrome M56之前,限制是1400 MB,而M57将其提升到2048 MB。我会更新我的答案。你知道我在哪里可以找到关于这个信息的官方文档吗?只有在源代码中:(查看
src/heap/heap.h
)。FWIW,大多数内存不足崩溃都发生在操作系统实际内存不足时,而不管V8的内部限制如何。这个答案()表明操作系统和浏览器版本对内存限制有影响,尽管他可能在谈论整个选项卡内存,而你在谈论的是JS堆大小。我认为
AudioBuffers
包含在V8的堆中,就像我拍摄“堆快照”时一样。至于WAV编码,我正在转换为一个16位文件,这也许可以解释为什么它只有3-4倍大。我将测试JS堆限制,然后再与您联系。非常感谢你的帮助!我目前有一个工作页面,哈