node.js - node垃圾回收、内存泄漏相关问题
某草草
某草草 2017-05-16 13:42:15
[Node.js讨论组]

最近刚开始研究垃圾回收,在试着回答饿了么大前端里的node内存释放相关的问题时,遇到了一些疑问:

let arr = [];
while(true)
  arr.push(1);

无限增加的数组,这肯定是会爆掉内存的。

let arr = [];
while(true)
  arr.push();

这个我觉得只是一直使用 arr ,导致 arr 不能被释放吧?

let arr = [];
while(true)
  arr.push(new Buffer(1000));

这个是因为 Buffer 的大小小于8k,会先检查内存池是否已满,所以应该不会爆掉内存?

var theThing = null  
var replaceThing = function () {
  var originalThing = theThing
  var unused = function () {
    if (originalThing)
      console.log("hi")
  }
  theThing = {
    longStr: new Array(1000000).join('*'),
    someMethod: function () {
      console.log(someMessage)
    }
  };
};
setInterval(replaceThing, 1000)

这个是因为 unusedoriginalThing 进行了引用,所以每一个 unused 都形成了一个 originalThing 的作用域 replaceThing 的闭包,这个闭包不会被回收掉,所以会在内存中一直累积?

因为自己不是很确定,所以麻烦懂的小伙伴回答一下,谢谢!

某草草
某草草

全部回复(2)
漂亮男人

new Buffer估计不是简单爆内存的问题,Buffer是分配在V8堆外的,所以实际上比第一个的问题还要严重,我刚才就直接死机了。

第二个应该说的是由于数组大小不会增长,所以不会爆内存。

第三个原文中就有提及原因

比如上述情况中 unused 的函数中持有了 originalThing 的引用, 使得每次旧的对象不会释放从而导致内存泄漏

如果还是不理解可以看看原发现者的文章,里面讲解的很详细。

高洛峰

我也不是很确定,不过可以用memwatch-next的包看看

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号