nodejs执行process.nextTick方法,会出现内存无法回收的问题
发布于 4 年前 作者 leasystu 3072 次浏览 最后一次编辑是 3 年前 来自 问答

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 () { }); 为什么会有内存无法回收的问题呢?

4 回复

应该和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出来后就不建议使用了; 其次不要过分的干预内存的回收; 最后内存并不是越小越好,他不回收只是没有二次申请操作,所以不触发,如果你强制回收可能会对你的服务性能有影响。

回到顶部