var showMem = function() { var mem = process.memoryUsage(); var format = function(bytes) { return (bytes/1024/1024).toFixed(2)+‘MB’; }; console.log('Process: heapTotal '+format(mem.heapTotal) + ’ heapUsed ’ + format(mem.heapUsed) + ’ rss ’ + format(mem.rss)); }; for(var i = 0 ; i < 1000000; i++){ process.nextTick(function () { }); } console.log("------------------------------------ ") setInterval(function(){ console.log("in interval ") showMem() }, 3000)
就这样一段代码。执行完之后,内存会暴涨,而且永远都无法降下来。 把这句话去掉,就正常的。 process.nextTick(function () { }); 为什么会有内存无法回收的问题呢?
应该和process.nextTick
无关改成setTimeout(function(){},0)
也是一样的。
应该是没有触发GC,试试下面的代码就知道。
var showMem = function() {
var mem = process.memoryUsage();
var format = function(bytes) {
return (bytes/1024/1024).toFixed(2)+'MB';
};
console.log('Process: heapTotal '+format(mem.heapTotal) + ' heapUsed ' + format(mem.heapUsed) + ' rss ' + format(mem.rss));
};
function add(){
for(var i = 0 ; i < 1000000; i++){
process.nextTick(function () {});
//setTimeout(function(){},0)
}
}
console.log("------------------------------------ ")
add();
setInterval(function(){
showMem()
}, 1000);
setInterval(add, 2000);
@cnwhy 还真的是这样。。。那如何可以强制触发 GC呢?
node --expose-gc 的形式运行 调用global.gc() 应该能强制gc
process.nextTick(function () { }); 首先明确一点,这个方法在setImmediate出来后就不建议使用了; 其次不要过分的干预内存的回收; 最后内存并不是越小越好,他不回收只是没有二次申请操作,所以不触发,如果你强制回收可能会对你的服务性能有影响。