Heim  >  Fragen und Antworten  >  Hauptteil

node.js – Probleme im Zusammenhang mit der Knoten-Garbage-Collection und Speicherlecks

Ich habe vor Kurzem angefangen, mich mit der Speicherbereinigung zu befassen, als ich im Ele.me-Frontend Fragen zur Knotenspeicherfreigabe beantworten wollte. Dabei stieß ich auf einige Fragen:

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

Eine unendliche Vergrößerung der Arrays wird den Speicher definitiv sprengen.

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

Ich denke, das wird einfach ständig verwendet arr ,导致 arr und es kann nicht veröffentlicht werden, oder?

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

Das liegt daran, dass die Größe von Buffer weniger als 8 KB beträgt. Es wird zunächst geprüft, ob der Speicherpool voll ist, sodass der Speicher nicht explodieren sollte.

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)

Das liegt an der Schließung von unusedoriginalThing 进行了引用,所以每一个 unused 都形成了一个 originalThing 的作用域 replaceThing. Diese Schließung wird nicht recycelt, sodass sie sich immer im Gedächtnis ansammelt?

Da ich mir nicht ganz sicher bin, möchte ich, dass jemand antwortet, der mehr weiß, danke!

某草草某草草2737 Tage vor701

Antworte allen(3)Ich werde antworten

  • 漂亮男人

    漂亮男人2017-05-16 13:44:15

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

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

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

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

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

    Antwort
    0
  • 黄舟

    黄舟2017-05-16 13:44:15

    死循环的代码到哪都会爆内存,特别是js这种单线程语言,直接阻塞卡死。
    Buffer类型我没用过,会不会检查内存池这个无法确定,但卡死了检不检查内存意义也不大。

    最后一个我同意你的说法,每次循环都新建一个对象,theThing的引用地址不断在变化,正常情况下旧的引用对象就应该被垃圾回收了,但由于unused引用了旧的对象originalThing,originalThing又一个私有变量,所以旧的对象无法被垃圾回收,就造成了内存泄露。

    有没有下面这段代码的区别,环境chrome,运行30s。
    第一幅图是没有这段代码的结果,内存在15M浮动。
    第二幅图是有这段代码的结果,内存不断增长。

    function unused() {
      if (originalThing) console.log("hi");
    }
    

    Antwort
    0
  • 高洛峰

    高洛峰2017-05-16 13:44:15

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

    Antwort
    0
  • StornierenAntwort