这是我参与8月更文挑战的第15天,活动详情查看:8月更文挑战
这是内存控制章节的第三篇文章,高效使用内存
- 第一篇:V8 的内存限制和原因
- 第二篇:V8 的垃圾回收机制
- 第三篇:高效使用内存
前面三篇文章讲到,由于 V8 垃圾回收机制的限制,nodejs 在使用内存时有一些限制,只能使用部分内存(64位系统下约为1.4 GB,32位系统下约为0.7 GB),另外浅析了一个 V8 垃圾回收机制中,对于老生代和新生代的回收算法。为了让 V8 垃圾回收机制更好的工作,我们需要注意全局变量和闭包的使用,因为它们会导致内存无法立即回收,让老生代中对象增多。
这篇文章介绍如何查看内存的使用情况、堆外内存的概念
查看内存使用情况
查看进程的内存占用
前面提到过,process.memoryUsage() 可以查看进程中的内存使用情况:
其中 rss 是 resident set size 的缩写,即进程的常驻内存部分。进程的内存分为:rss、交换区(swap)、文件系统(filesystem)几部分。
可以看到我们上面截图的例子中,rss(26.8M)、heapTotal(9.2M)、heapUsed(5.2M)
查看系统的内存占用 os 模块的 totalmem 和 freemem 这两个方法可以查看操作系统的内存使用情况,分别返回系统的总内存和闲置内存
可以看到,实例中操作系统的总内存是 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
以上是如何查看内存的使用情况、堆外内存的概念,欢迎评论和点赞~