怎么自己检查NodeJS的代码是否存在内存泄漏
发布网友
发布时间:2022-04-26 17:58
我来回答
共2个回答
热心网友
时间:2022-04-23 00:41
首先,我们来看一个简单的内存泄漏
var http = require('http');
var server = http.createServer(function (req, res) {
for (var i=0; i<1000; i++) {
server.on('request', function leakyfunc() {});
}
res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
server.setMaxListeners(0);
console.log('Server running at http://127.0.0.1:1337/. Process PID: ', process.pid);
每一个请求我们增加了1000个导致泄漏的*。如果我们在一个shell控制台中执行以下命令:
while true; do curl "http://127.0.0.1:1337/"; done
然后在另外一个shell控制台中查看我们的进程
top -pid
我们会看到node进程产生异常高的内存占用,我们的node进程看起来失控了。那么,当我们的node进程出现这种情况的时候,通常我们该怎样诊断出问题的根源?
内存泄露的检测
npm模块 memwatch 是一个非常好的内存泄漏检查工具,让我们先将这个模块安装到我们的app中去,执行以下命令:
npm install --save memwatch
然后,在我们的代码中,添加:
var memwatch = require('memwatch');
//memwatch.setup(); 原文有这行代码,最新版本的memwatch已去掉这个方法(译者注)
然后监听 leak 事件
memwatch.on('leak', function(info) {
console.error('Memory leak detected: ', info);
});
这样当我们执行我们的测试代码,我们会看到下面的信息:
{
start: Fri Jan 02 2015 10:38:49 GMT+0000 (GMT),
end: Fri Jan 02 2015 10:38:50 GMT+0000 (GMT),
growth: 7620560,
reason: 'heap growth over 5 consecutive GCs (1s) - -2147483648 bytes/hr'
}
参考文献https://w3ctech.com/topic/842#rd?sukey=1a2e6cf0ed628693963c7d024fae83cd29147e987cc93e20f3292fef404a2fc91774fa0e1af5eeb690c5521ad1e164fb
热心网友
时间:2022-04-23 01:59
首先,我们来看一个简单的内存泄漏
var http = require('http');
var server = http.createServer(function (req, res) {
for (var i=0; i<1000; i++) {
server.on('request', function leakyfunc() {});
}
res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
server.setMaxListeners(0);
console.log('Server running at http://127.0.0.1:1337/. Process PID: ', process.pid);
每一个请求我们增加了1000个导致泄漏的*。如果我们在一个shell控制台中执行以下命令:
while true; do curl "http://127.0.0.1:1337/"; done
然后在另外一个shell控制台中查看我们的进程
top -pid
我们会看到node进程产生异常高的内存占用,我们的node进程看起来失控了。那么,当我们的node进程出现这种情况的时候,通常我们该怎样诊断出问题的根源?
内存泄露的检测
npm模块 memwatch 是一个非常好的内存泄漏检查工具,让我们先将这个模块安装到我们的app中去,执行以下命令:
npm install --save memwatch
然后,在我们的代码中,添加:
var memwatch = require('memwatch');
//memwatch.setup(); 原文有这行代码,最新版本的memwatch已去掉这个方法(译者注)
然后监听 leak 事件
memwatch.on('leak', function(info) {
console.error('Memory leak detected: ', info);
});
这样当我们执行我们的测试代码,我们会看到下面的信息:
{
start: Fri Jan 02 2015 10:38:49 GMT+0000 (GMT),
end: Fri Jan 02 2015 10:38:50 GMT+0000 (GMT),
growth: 7620560,
reason: 'heap growth over 5 consecutive GCs (1s) - -2147483648 bytes/hr'
}
参考文献https://w3ctech.com/topic/842#rd?sukey=1a2e6cf0ed628693963c7d024fae83cd29147e987cc93e20f3292fef404a2fc91774fa0e1af5eeb690c5521ad1e164fb