在 Chrome 和 Chromium OS 中,内存限制由浏览器定义,您可以通过按 F12 在开发人员工具命令行中使用以下命令检查限制:
> window.performance.memory.jsHeapSizeLimit
1090519040
在我的 Windows 10 操作系统上,大约为 1 GB。
在 Chrom(e/ium) 上,您可以通过分配本机数组来绕过堆大小限制:
var target = []
while (true) {
target.push(new Uint8Array(1024 * 1024)); // 1Meg native arrays
}
这会使选项卡在 2GB 左右崩溃,这种情况发生得非常快。之后 Chrom(e/ium) 就会陷入混乱,如果不重新启动浏览器就无法重复测试。
我还推荐阅读 TrackJS 的博文监控 JavaScript 内存在您深入尝试诊断或测量浏览器中与内存相关的任何内容之前。
您还可以搜索 comp.lang.javascriptJavaScript内存限制.
另请参阅这些 Stack Overflow 帖子:
Maximum size of an Array in Javascript, which suggests you can store up to 232-1 = 4,294,967,295 = 4.29 billion elements.
JavaScript 函数可以接受的最大参数数量
JS9天文图像展示库网站上还有更多知识:处理内存限制.
(我试图找到一个好的答案,这里提供的“没有上限”答案对我来说很愚蠢。我不能在一个数百万美元的项目中遇到生产问题并对管理层说:“好吧,我假设没有上限,一切都会好起来的。”尝试进行概念验证,例如在您选择的 JavaScript UI 框架中加载大量组合框控件等。您可能会发现您的框架有一些性能下降.)
我发现以下一些组件在 CPU 性能和内存性能方面都具有很好的扩展性:
-
Microsoft Monaco editor
- This is used by several commercial projects:
- 邮递员,从 v7.1.1-canary08 开始
- VS Code
以下是一些众所周知的性能下降的框架示例:
- Angular: Poor change detection approach.
- For each async event, compare each of the bindings (Model-Dom binding) to its old value to decide if to re-render.
- NG1:>2500 名观察者,性能逐渐停止
- NG2:同样的问题仍然存在,但您有一个漫长而疲惫的解决方法:切换到不可变并在您的应用程序中传播 ChangeDetectionStrategy.onPush 以关闭默认的有问题的策略
- React
- Again, Immutable collections of JS objects only scale so far.
- create-react-app内部使用了Immutable.JS,而Immutable.JS在消亡之前只能创建大约500k个不可变集合。
以下是一些需要考虑的其他事项:
- Use array.slice 用于操作数组最大限度地减少额外的数组分配; array.slice 将就地修改数组,这将减少垃圾收集和总体堆大小。