对 Chrome/V8 堆内存限制的研究

发布时间 2023-08-09 14:34:09作者: China Soft

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的堆内存限制。具体验证方法可以参考这里