【8.13】nodejs 原理学习 – 内存控制(1) – V8 的内存限制和原因

这是我参与8月更文挑战的第12天,活动详情查看:8月更文挑战

这篇文章是对 深入浅出 nodejs 这本书的第五章 – 内存控制的学习笔记和练习,这是这个系列的第一篇文章,欢迎大家点赞和评论~

总述

在前端开发中,由于 V8 的垃圾回收机制,我们基本上不用担心开发过程中内存泄漏的问题,但是在性能敏感的服务端开发中,我们需要关注这个问题

我们发现,在 nodejs 中使用内存时会有一定的限制,只能使用部分内存(64位系统下约为1.4 GB,32位系统下约为0.7 GB),在这样的限制下,我们不能在内存中操作大文件对象,比如不能把一个2 GB大小的文件读入内存中进行字符串处理,即使机器的物理内存有32 GB。在 nodejs 单进程的情况下,机器的内存没法得到充分的利用

这个问题的原因主要是 nodejs 基于 V8 构建,V8 的内存分配机制。虽然在平时开发过程中,触达这个界限的时候比较少,但是如果不小心触发了,会导致进程的退出。

所以,下面会从几个方面,一起看看 V8 为什么会有这样的内存限制,知道原因之后,可以更好的避免这个问题:

V8 的对象分配

我们知道,在 V8 中所有对象都是存储在堆中,通过堆进行内存分配的,我们可以通过 nodejs 的 API 查看目前的内存使用情况

screenshot-20210813-132015.png

那么 V8 为什么要做这样的内存限制呢?

从表层原因上说,是因为 V8 最初是为浏览器设计的,浏览器环境下,这个内存限制绰绰有余了

从深层原因上看,是因为 V8 垃圾回收机制的限制,按照官方的说法来说,以回收 1.5 GB 堆内存为例,V8 做一次小的垃圾回收需要 50ms 以上,做一次非增量的垃圾回收甚至需要 1s 以上。而这些垃圾回收的时间,是 JavaScript 单线程暂停执行的时间,如果垃圾回收的时间过长,应用的响应速度和性能都会直线下降,所以限制内存使用是一个比较好的选择。

这个限制也是可以打开的,在 V8 启动时,可以有下面两个方式调整内存的大小

node --max-old-space-size=1700 test.js // 单位为MB
node --max-new-space-size=1024 test.js // 单位为KB
复制代码

以上是 V8 的内存限制和原因,这个系列下一篇文章,将会深入分析 V8 在垃圾回收方面的策略,让我们在内存限制下更好的编程~

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享