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

时间:2015-03-21 17:13:34

标签: node.js

What do the return values of node.js process.memoryUsage() stand for?退出RSS是驻留集大小,进程内存中保存在RAM中的部分 (通过此过程在字节中保存在RAM中的内存量)示例中使用的“text.txt”文件大小为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);

所以在app bootstrap:{ rss: 22069248, heapTotal: 15551232, heapUsed: 9169152 } 在我提出10个“/ test”请求后,情况是:

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

因此,从app boostrap到 10th 请求,rss增加了11378688字节,大约 30 大于text.txt文件的大小。

我知道这段代码会在将结果写回客户端之前将整个data.txt文件缓存到每个请求的内存中,但我希望在requst完成之后,“text.txt”的占用内存将被释放? 但事实并非如此?

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

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:1)

尝试再次运行您的示例,并为进程提供一些时间来运行垃圾回收。使用系统监视器密切关注进程的内存使用情况,并在一段时间后清除。如果它没有下降,则进程的内存使用量不会高于下面提到的。

根据node documentation,32位的内存限制为512 MB,64位的内存限制为1 gb。如有必要,可以增加它们。