一个关于Promise内存泄漏的问题,请求解答。
发布于 8 年前 作者 damnboy 3147 次浏览 来自 问答

初学js,问题描述可能不是特别准确,还行见谅。

bing promise内存泄漏的时候,找到这样一篇文章 《关于Promise内存泄漏的问题》 文章里有这样一段话: ***不过V8对Promise的实现存在内存泄漏问题,当一个promise无法resolve也无法reject的时候,就会发生内存泄漏。 ***

于是我就想验证一下promise在既没有resolve也没有reject的时候,时不时确实有内存泄漏。 接下来便有了这段代码 while(true){ var promise = new Promise(function(resolve){ }) promise .then(function(resolve){ console.log(resolve); }) } 运行起来之后,发现内存迅速增长。

接下来我加入resolve while(true){ var promise = new Promise(function(resolve){ resolve(1) }) promise .then(function(resolve){ console.log(resolve); }) } 再次运行,发现内存还是迅速增长。 这和文章里的描述不一样,于是我就怀疑是不是自己代码写的有问题。

便对代码做出一些修改,在while中emit事件,并在while之外创建并resolve Promise对象

	var EventEmitter = require('events').EventEmitter;
	var q = new EventEmitter();
	q.on('loop', function(){
		var promise = new Promise(function(resolve){
		})
		promise
		.then(function(resolve){
		console.log(resolve);
		}
	})

	while(true){
		q.emit('loop');
	}

问题依旧存在,内存依然增长,打了断点,发现emit之后,进入回调函数处理,其实并不是异步的,所以这么改没有效果也说得过去。

接着我又我怀疑是作用域导致的问题,我便对代码做出一些修改。用(function(){})()来封闭作用域 while(true){ (function(){ var promise = new Promise(function(resolve){ resolve(‘test’); }) promise .then(function(resolve){ console.log(resolve); }) })() } 然而,这并没有什么卵用。

最后我想到了用setInterval来取代while setInterval(function(){ var promise = new Promise(function(resolve){ resolve(‘test’); }) promise .then(function(resolve){ console.log(resolve); }) },0);

再观察进程的内存,发现不再增长了。 即便我将resolve(‘test’);这行代码去掉,也见内存有所增长。

这里我想问问,一个promise,既不resolve,也不reject到底会不会有内存泄漏。 这里的内存泄漏问题,又到底是什么问题导致的?

2 回复

var改let 呢,等大神

来自酷炫的 CNodeMD

while(true){console.log(“你要搞挂自己,是啥意思?”)}

回到顶部