V8内存分配

一般的后端语言中,在基本的内存使用上是没有限制的,但是在node中通过JavaScript使用内存时就会发现只能使用部分内存(64位系统约为1.4G,32位系统约为0.7G),在这样的限制下,node无法直接将一个大文件读入内存进行处理,即使电脑的物理内存有16G,在单个node进程的情况下,内存也无法得到充足的使用。

查询堆上限

属性介绍

内存限制

介绍

  1. Node.js默认的内存限制
    1. Node.js默认的内存限制取决于你的操作系统和Node.js的版本。在大多数情况下,Node.js默认的内存限制应该是1.4GB(1024 * 1024 * 1400 字节),这是在64位系统下的情况。而在32位系统下,默认的内存限制大约是0.7GB。此外,这个默认的内存限制可能会因Node.js的不同版本以及你的操作系统而有所变化。
  1. 解决
    1. 如果你的Node.js进程消耗了大量内存,可能是因为有内存泄漏或者其他性能问题。你可以:
      • 优化内存消耗;
      • 如果你需要更高的内存限制,可以使用-max_old_space_size参数来手动设置内存限制的大小。

case

node 容器中内存限制
When Node.js applications are running within containers with memory limits set (using the --memory option for docker or any other flags with your orchestration system), use the --max-old-space-size
option to ensure that Node knows its limit and that the set value is smaller than the container limit.
当 Node.js 应用程序在设置了内存限制的容器中运行时(使用 docker 的 --memory 选项或编排系统的任何其他标志),请使用 --max-old-space-size 选项来确保 Node知道其极限并且设定值小于容器极限。

-max-new-space-size 新生代—!!!问题

按照常理,好多gc都是可以支持这些的,node不太一样,有些文章的有你搜不到,不知道这些人是从哪里知道的
具体能配置的,参考这个
node18.17.0 Option
或者node官网
或者node版本下,自行查看
 

--max-old-space-size 老生代

设置 V8 旧内存部分的最大内存大小。 随着内存消耗接近极限,V8 会花更多的时间在垃圾回收上,以释放未使用的内存。
在具有 2 GiB 内存的机器上,考虑将其设置为 1536 (1.5 GiB) 以留出一些内存用于其他用途并避免交换。

--max-semi-space-size=SIZE

设置 V8 清理垃圾收集器的最大半空间大小(以 MiB(兆字节)为单位)。增加半空间的最大大小可能会提高 Node.js 的吞吐量,但代价是消耗更多内存。
由于 V8 堆的年轻代大小是半空间大小的三倍(请参阅 V8 中的 YoungGenerationSizeFromSemiSpaceSize ),因此半空间增加 1 MiB 适用于三个单独的半空间中的每一个。空间并导致堆大小增加 3 MiB。吞吐量的提高取决于您的工作负载(请参阅#42511)。
64 位系统的默认值为 16 MiB,32 位系统的默认值为 8 MiB。为了获得应用程序的最佳配置,您应该在为应用程序运行基准测试时尝试不同的 max-semi-space-size 值。

垃圾回收

整体流程

在V8的内存分配中分为堆和栈 • 栈内存存储基本类型数据以及引用类型数据的内存地址 • 堆内存储存引用类型的数据垃圾回收主要存在于堆的新生代和老生代新生代中分为两个空间,Semi space fromSemi space To,这两个空间严格对半分老生代:从新生代空间经过至少两轮Minor GC仍然存活下来的数据内存大小与操作系统有关,64位1.4G32位0.7G • 64位新生代空间是64MB,老生代为1400MB • 32位新生代空间是32MB,老生代为700MB • 新版的Node在v14之后,内存已经有2G了新生代和老生代用的是两种完全不同的垃圾回收机制 • 新生代Scavenge算法(新生代互换) • 老生代是标记整理清除:Mark-Sweep(标记清除)、 Mark-Compact(标记整理)
作者:空城机链接:https://juejin.cn/post/7022993954677194766来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

简单介绍一下 V8 引擎的垃圾回收机制

V8 新生代对象晋升到老生代有两个条件:

Loading...
目录
文章列表
王小扬博客
产品
Think
Git
软件开发
计算机网络
CI
DB
设计
缓存
Docker
Node
操作系统
Java
大前端
Nestjs
其他
PHP