Promise
Promise 是 ES6 的新特性,在 ES6 之前各大浏览器、各种 polyfill 和各种 js 执行环境都针对 Promise 进行了自己的实现,不过实现上大同小异。
V8 Promise 内存泄漏
不过 V8 对 Promise 的实现存在内存泄漏问题,当一个 promise 无法 resolve 也无法 reject 的时候,就会发生内存泄漏。
一个很容易造成 Promise 内存泄漏的场景便是递归 Promise 或者嵌套 Promise。
为方便观察内存使用情况,下面是一段在 Nodejs 里面运行的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
(function() { // 记录Promise链的长度 var i = 0; function run() { return new Promise(function(resolve) { // 每增加10000个Promise打印一次内存使用情况 if (i % 10000 === 0) console.log(i); i++; // 模拟一个异步操作 setTimeout(function() { // 100000个Promise之后退出 if(i === 10000 * 10) return resolve(); // 如果resolve的参数是一个Promise,外层Promise将接管这个Promise的状态,构成嵌套Promise resolve(run()); }, 0); }).then(function() {}); } run(); })(); |
在我的电脑上输出:
1 2 3 4 5 6 7 8 9 10 |
{ rss: 18649088, heapTotal: 12359168, heapUsed: 5261784 } { rss: 47480832, heapTotal: 54668544, heapUsed: 23838080 } { rss: 78712832, heapTotal: 69115648, |