node.js - node进程内存占用,resident set size不断增加

标签 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);

所以在应用 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 }

因此从应用程序 boostrap 到第 10nth 请求 rss 增加了 11378688 字节,这大约是 text.txt 文件大小的 30 倍.

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

第二个如何设置 Node 进程可以消耗的最大RAM内存大小?

最佳答案

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

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

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

关于node.js - node进程内存占用,resident set size不断增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29185570/

相关文章:

javascript - 如何使用过滤器或其他JS方法(按属性)显示特定的JSON数据

javascript - 路由器未定义 Node.js

node.js - 带有 docker 的 Mongo 副本 Node

javascript - Typescript 在导入 Node.js 时找不到自己类的名称

node.js - 使用 Nodejs 在 selenium 中获取 Promise Pending

javascript - NodeJs Javascript 从数组动态调用函数

javascript - 如何通过单击按钮触发 javascript

node.js - 使用 async_hooks 跟踪上下文

javascript - Mongoose 响应无法正确解析

javascript - 如何使用 javascript(node.js) 从 Microsoft Dynamics CRM 接收 webhook?