对 Chrome/V8 堆内存限制的研究
https://zhuanlan.zhihu.com/p/567115829
开局直接放结论,具体的验证过程比较无聊,有兴趣的可以翻到后面细看。
- 堆内存的限制是由 V8 来设置的。
- 早期的时候,V8对堆内存的限制大约是 800MB(32位)/ 1400MB(64位),但那是非常早期的情况了。
- 针对最新的 Chrome 和 Node 来说,V8设置了一个最终的限制,无论你物理内存多大,在不特殊设置的情况下,都不得超过下列值。
64位系统
物理内存 > 16G => 最大堆内存限制为4G
物理内存 <= 16G => 最大堆内存限制为2G
32位系统
最大堆内存限制为1G
- 上述结论依赖于设备有充足的物理内存。内存不足时,实际的计算公式如下
堆内存限制 = min([ 物理内存 / 4 * 调整系数 ], V8最大限制 )
// 其中调整系数为 sizeof(void*) / 4 ,sizeof(void*)是系统指针长度,64位是8 , 32位是4.
// 位数取决于软件的位数,比如你是64位系统,但是PC的QQ还是32位的,还是视作32位的.
// 其webview的堆内存上限就是1G,不因你系统位数而改变
// 例:假如你是64位系统但只有2G内存(非常罕见的情况),你的最大堆内存限制为 2 / 4 * 2 = 1G
- 设置 max_heap_size 或者 max-old-space-size 可以更改V8的堆内存限制。具体验证方法可以参考这里