nodejs内存泄漏有几种情况
nodejs memory leak in several cases
- 原始的本地tcp服务器我使用了一个客户端测试代码来并发长连接服务器,什么也不做连接5周后,我关闭了client.js,但服务器端将有大约100M的内存
服务器代码:
var net = require('net');
var server = net.createServer(function(client) {
console.log('server connected');
client.on('data',function(){});
client.on('end',function(){console.log('end');});
});
server.listen(8124, function() {
console.log('server bound');
});
客户端代码:
var net = require('net');
var host = '192.168.0.110'
// var host = "localhost"
, port = 8124
for(var i=0; i < 50000; i++){
var client = net.connect({host: host, port: port},
function(i){
return function() { //'connect' listener
var num = i;
console.log('client connected ' + num);
}}(i)
);
client.on('end',function(){
console.log('end');
client.end()
})
}
客户端在另一台机器上
2、长回路
var a = b = c = d = [];
console.log((process.memoryUsage().heapUsed / 1024 / 1024).toFixed(2), 'Mb');
for(i=0;i<50000;i++){
a.push(new Date());
b.push(new Date());
c.push(new Date());
d.push(new Date());
}
console.log((process.memoryUsage().heapUsed / 1024 / 1024).toFixed(2), 'Mb');
a = null;
b = null;
c = null;
d = null;
console.log('null');
console.log((process.memoryUsage().heapUsed / 1024 / 1024).toFixed(2), 'Mb');
console.log((process.memoryUsage().heapUsed / 1024 / 1024).toFixed(2), 'Mb');
setInterval(function(){
console.log((process.memoryUsage().heapUsed / 1024 / 1024).toFixed(2), 'Mb');
},5000);
我将变量设置为null,但内存不会释放。有人告诉我使用process.nextTick来防止长循环但它仍然不起作用。
取消分配引用并将其设置为null后,内存不会立即释放。如果您想强制GC在给定时刻执行:
- 使用--expose-gc启动节点
node --expose-gc test.js
- 在代码中添加gc调用:
global.gc();
您不应该在生产中这样做,因为V8本身处理GC调用,并且在这方面做得很好。
您的客户端js:出现问题
client.on('end', function() {
console.log('end');
client.end()
})
此事件将在连接结束后发生,您可以通过调用.end()
。。。因此在结束事件中调用CCD_ 4没有任何意义。此外,您根本没有关闭连接:
var client = net.connect({
host: host,
port: port
}, function(i) {
return function() { //'connect' listener
var num = i;
console.log('client connected ' + num);
this.end() //Close the connection
}
}(i));
在修复后,我可以毫无例外地运行你的代码,它没有为我泄漏。
服务器代码:
function getUsed() {
return process.memoryUsage().heapUsed;
}
var startedWith;
var net = require('net');
var server = net.createServer(function(client) {
client.on('data', function() {});
client.on('end', function() {
console.log("end");
});
});
server.listen(8124, function() {
startedWith = getUsed();
});
setInterval(function() {
gc();
}, 13);
setInterval(function() {
gc();
console.log(getUsed() - startedWith);
}, 250)
使用节点0.10 $ node --expose-gc server.js
运行
客户代码:
var net = require('net');
var host = 'localhost',
port = 8124
for (var i = 0; i < 1500; i++) {
var client = net.connect({
host: host,
port: port
},
function(i) {
return function() { //'connect' listener
var num = i;
console.log('client connected ' + num);
this.end();
}
}(i));
client.on('end', function() {
console.log('end');
})
}
在服务器运行后使用节点0.10 $ node client.js
运行。
相关文章:
- parseJSON在一种情况下有效,而在另一种情况中无效
- 匹配Javascript中的几种不同的电子邮件地址格式
- 输入文本是't在一种情况下以相同的形式更新与另一种情况相同的角度模型
- 动态加载图像的几种好方法是什么
- 如何实现这种悬停效果?尝试了几种方法,但没有成功
- 在JS中使用OOP的几种格式
- 如何防止用户为每种情况选择单选按钮
- Javascript Switch 语句中的默认值仅适用于一种情况,但不适用于两种情况
- 对每种情况使用一个事件(JavaScript 开关)
- JavaScript:在 .5 种情况下向下舍入
- 为什么JavaScript在第二种情况下不查找全局范围
- JSLint 不喜欢默认作为开关中的第一种情况
- 将regex输出返回到第一种情况
- 如何仅在一种情况下打开chrome扩展弹出窗口
- 正则表达式,以包括所有特定模式并仅排除一种情况
- 使用javascript中的常规exp验证数字,但在一种情况下不起作用
- 为什么out.println输出只有两种情况为空
- Phonegap:JS对Java方法的调用仅在1种情况下有效
- Javascript-目标DOM在一种情况下工作,而不是在另一种情况
- nodejs内存泄漏有几种情况