js 求解一个闭包内存泄露问题

发布于 2022-09-12 13:11:53 字数 192 浏览 36 评论 0

function test() {
    var a = [];
    return function (){
        a.push(1)
        return a
    }
}
var t = test();
t();
t();
t = null;

这样的话 a 会被释放吗? 如何不会应该怎么释放?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

清风挽心 2022-09-19 13:11:53

这是写 t=null时的图

image.png

这是不写 t = null时的图

image.png
以上都是在无痕模式下6秒的结果
可以发现无论是否写t = null, 都是没发生内存泄漏的。

多次测试, 偶尔有以下结果
image.png

可以发现,有创建堆栈,但是是趋于稳定的,是绝对没发生内存泄漏的。
也许这就是v8的威力吧

以上测试是在遍历1w遍的情况下产生的。
再次根据次数测试

测试

1W

for (let i = 0; i < 10000; i++) {
    t();
  }

image.png
最终被释放, 且最高时占用1.6mb

100w

for (let i = 0; i < 1000000; i++) {
    t();
  }

image.png
最终被释放,且最高时占用2.8mb,最终heap为883kb

10000w

for (let i = 0; i < 100000000; i++) {
    t();
  }

image.png
最终被释放,且最高时占用还是2.8mb,最终heap为883kb

修改代码测试

将t的引用放入循环会怎样?

 for (let i = 0; i < 100000000; i++) {
    var t = test();
    t();
  }

image.png
可以看到确实比把引用写在外面多占用了很多内存,但最终还是平稳趋于2.0mb,所以并未造成内存飞升,只是t的引用没有释放.

手动将t引用释放!

for (let i = 0; i < 100000000; i++) {
    var t = test();
    t();
    t = null
  }

image.png

芜湖~ 起飞 heap又回到了883kb ~

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文