【8.17】nodejs 原理学习 - 内存控制(4) - 内存指标

522 阅读2分钟

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

这是内存控制章节的第三篇文章,高效使用内存

前面三篇文章讲到,由于 V8 垃圾回收机制的限制,nodejs 在使用内存时有一些限制,只能使用部分内存(64位系统下约为1.4 GB,32位系统下约为0.7 GB),另外浅析了一个 V8 垃圾回收机制中,对于老生代和新生代的回收算法。为了让 V8 垃圾回收机制更好的工作,我们需要注意全局变量和闭包的使用,因为它们会导致内存无法立即回收,让老生代中对象增多。

这篇文章介绍如何查看内存的使用情况、堆外内存的概念

查看内存使用情况

查看进程的内存占用

前面提到过,process.memoryUsage() 可以查看进程中的内存使用情况:

image.png

其中 rss 是 resident set size 的缩写,即进程的常驻内存部分。进程的内存分为:rss、交换区(swap)、文件系统(filesystem)几部分。

可以看到我们上面截图的例子中,rss(26.8M)、heapTotal(9.2M)、heapUsed(5.2M)

查看系统的内存占用 os 模块的 totalmem 和 freemem 这两个方法可以查看操作系统的内存使用情况,分别返回系统的总内存和闲置内存

image.png

可以看到,实例中操作系统的总内存是 32GB,闲置内存是 4.4GB

堆外内存

从 process.memoryUsage() 的结果我们可以看到,进程的常驻内存大于 V8 堆已申请的内存,这是什么原因呢?

我们会发现,使用 Buffer 对象时,rss 中内存增加,但 heapTotal 变化比较小。因为 JavaScript 中 Buffer 对象不同于其他对象,它不经过 V8 的内存分配机制,所以也不会有堆内存的大小限制,可以远超于 V8 的内存限制值。是存在于 rss 中,不通过 V8 分配的独立内存。因为 nodejs 不同于浏览器的应用场景,需要去处理网络和 I/O 流,单纯操作字符串远远不能满足性能要求,具体会在后面去讲。

小结

下面的图是对本次文章讲到的内存的总结,如有不对请指教:

graph TD
os.totalmem --> os.freemem
os.totalmem --> 系统使用中内存
系统使用中内存 --> node进程常驻内存rss
系统使用中内存 --> 其他
node进程常驻内存rss --> V8堆内存已申请总量heapTotal
node进程常驻内存rss --> Buffer使用内存
V8堆内存已申请总量heapTotal --> V8堆内存使用量heapUsed

以上是如何查看内存的使用情况、堆外内存的概念,欢迎评论和点赞~