Large-Allocation

已弃用: 不再推荐使用该特性。虽然一些浏览器仍然支持它,但也许已从相关的 web 标准中移除,也许正准备移除或出于兼容性而保留。请尽量不要使用该特性,并更新现有的代码;参见本页面底部的兼容性表格以指导你作出决定。请注意,该特性随时可能无法正常工作。

非标准: 该特性是非标准的,请尽量不要在生产环境中使用它!

非标准的 Large-Allocation 响应标头用于告知浏览器加载该页面可能需要申请大内存块。它没有被任何当前版本的浏览器实现,但将它发送到任何浏览器都是安全的。

WebAssembly 或者 asm.js 应用会使用大量连续的已分配内存块。例如,对于一些复杂的游戏,其申请的空间将会非常大,有时甚至会达到 1GB。Large-Allocation 告知浏览器其将要加载的页面可能需要申请一个大的连续内存空间,浏览器依据该标头可能会单独启动一个专有的进程用于处理该页面。

标头类型 响应标头
禁止修改的标头

语法

http
Large-Allocation: 0
Large-Allocation: <megabytes>

指令

0

0 是一个特殊的值,代表分配的大小是不确定的。

<megabytes>

预期需要申请的内存大小,以兆字节为单位。

示例

http
Large-Allocation: 0
Large-Allocation: 500

排除错误

如果使用不当,Large-Allocation 标头会抛出警告或者错误信息,你可以在 web 控制台中查看它们。

由于存在 Large-Allocation 标头,当前页面会在一个新的进程加载。

该消息意味着浏览器遇到了 Large-Allocation 标头,并且能够在一个新的进程中重新加载页面,这个进程应该有更多的可用连续内存。

Large-Allocation 标头由非 GET 请求触发而被直接忽略。

当使用 POST 请求加载文档时,加载目前无法被重定向到新的进程中。这个错误会在使用非 GET HTTP 方法加载带有 Large-Allocation 标头的文档时显示。例如,这可能是由于当前文档是通过表单提交加载的。

由于存在通过框架层级或者 window.opener 引用当前浏览上下文的窗口,Large-Allocation 标头被直接忽略。

该错误意味着文档不是在用户打开的或者 noopener 打开的标签或窗口的顶层加载的。它可能在以下情况下出现:

  • 带有 Large-Allocation 标头的文档是在 <iframe> 中加载的。Firefox 目前无法将 iframe 移动到新的进程中,所以文档必须在当前进程中加载。
  • 带有 Large-Allocation 标头的文档是在由 window.open()<a target="_blank"> 或者其他类似方法在没有设置 rel="noopener" 或者 "noopener" 特性的情况下打开的窗口中加载的。这些窗口必须与其打开的窗口保持在同一进程中,因为它们可以相互通信,这意味着我们不能允许它们切换进程。
  • 带有 Large-Allocation 标头的文档已经使用 window.open()<a target="_blank"> 或其他类似方法在没有设置 rel="noopener" 或者 "noopener" 特性的情况下打开了另一个窗口。这与上面的原因相同,即它们可以相互通信,因此我们不能允许它们切换进程。
由于存在 Large-Allocation 标头,当前页面会在一个新的进程加载,然而 Large-Allocation 进程创建在非 Win32 平台上被禁用了。

Firefox 目前仅在 32 位 Windows 构建中支持 Large-Allocation 标头,因为内存碎片化在 64 位构建中不是问题。如果你正在运行非 win32 版本的 Firefox,这个错误会出现。你可以在 about:config 中使用 dom.largeAllocation.forceEnable 布尔首选项来禁用该检查。

规范

现还不属于任何规范,可以通过这篇文档了解该标头的背后思想。

浏览器兼容性

BCD tables only load in the browser

参见