【8.13】nodejs 原理学习 - 内存控制(1) - V8 的内存限制和缘由

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

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

总述

在前端开发中,因为 V8 的垃圾回收机制,咱们基本上不用担忧开发过程当中内存泄漏的问题,可是在性能敏感的服务端开发中,咱们须要关注这个问题编程

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

这个问题的缘由主要是 nodejs 基于 V8 构建,V8 的内存分配机制。虽然在平时开发过程当中,触达这个界限的时候比较少,可是若是不当心触发了,会致使进程的退出。markdown

因此,下面会从几个方面,一块儿看看 V8 为何会有这样的内存限制,知道缘由以后,能够更好的避免这个问题:app

V8 的对象分配

咱们知道,在 V8 中全部对象都是存储在堆中,经过堆进行内存分配的,咱们能够经过 nodejs 的 API 查看目前的内存使用状况post

screenshot-20210813-132015.png

那么 V8 为何要作这样的内存限制呢?性能

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

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

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

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

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

相关文章
相关标签/搜索