节点进程内存使用量,驻留组大小不断增加

node.js process.memoryUsage()的返回值代表什么? RSS是驻留集的大小,在这个例子中使用的'text.txt'的文件大小是RAM中保存的进程内存的部分(这个进程以字节为单位保存在RAM中的内存量)是370KB(378880字节)

var http = require('http'); var fs = require('fs'); var express = require('express'); var app = express(); console.log("On app bootstrap = ", process.memoryUsage()); app.get('/test', function(req, res) { fs.readFile(__dirname + '/text.txt', function(err, file) { console.log("When File is available = ", process.memoryUsage()); res.end(file); }); setTimeout(function() { console.log("After sending = ", process.memoryUsage()); }, 5000); }); app.listen(8081); 

所以在应用程序bootstrap: { rss: 22069248, heapTotal: 15551232, heapUsed: 9169152 }我做了10个'/testing'的情况是:

 When File is available = { rss: 33087488, heapTotal: 18635008, heapUsed: 6553552 } After sending = { rss: 33447936, heapTotal: 18635008, heapUsed: 6566856 } 

所以从应用程序boostrap到10的请求rss增加了11378688字节这大约是text.txt文件的大小的30倍。

我知道这个代码会将每个请求的整个data.txt文件caching到内存中,然后将结果写回到客户端,但是我预计在请求完成后占用“text.txt”的内存会被释放吗? 但事实并非如此?

其次,如何设置节点进程可以消耗的RAM内存的最大大小?

       

网上收集的解决方案 "节点进程内存使用量,驻留组大小不断增加"

在js垃圾收集器不会立即运行您的代码执行后。 因此执行后内存不会立即释放。 如果您关心内存消耗,您可以在处理大对象之后独立运行GC。 更多信息,你可以在这里find。

 setTimeout(function() { global.gc(); console.log("After sending = ", process.memoryUsage()); }, 5000); 

要查看内存分配,可以使用v8-profiler运行服务器并获取堆快照。 更多信息在这里 。

尝试再次运行您的示例,并给该进程一些时间运行垃圾回收。 用系统监视器注意进程的内存使用情况,并在一段时间后清除。 如果没有下降,这个过程不能比以下提到的更高的内存使用率。

根据节点文档 ,内存限制为32位512 MB,64位1 GB。 必要时可以增加。