cari

Rumah  >  Soal Jawab  >  teks badan

node.js - Isu yang berkaitan dengan pengumpulan sampah nod dan kebocoran memori

Saya baru mula mengkaji pengumpulan sampah baru-baru ini Apabila saya cuba menjawab soalan yang berkaitan dengan keluaran memori nod di bahagian depan Ele.me, saya menemui beberapa soalan:

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

Tatasusunan yang semakin meningkat tidak terhingga pasti akan memecahkan ingatan.

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

Saya rasa ini hanya digunakan sepanjang masa arr ,导致 arr dan ia tidak boleh dikeluarkan, bukan?

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

Ini kerana saiz Buffer kurang daripada 8k Ia akan menyemak dahulu sama ada kolam memori penuh, jadi ia tidak boleh meletupkan memori?

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)

Ini kerana penutupan unusedoriginalThing 进行了引用,所以每一个 unused 都形成了一个 originalThing 的作用域 replaceThing ini tidak akan dikitar semula, jadi ia akan sentiasa terkumpul dalam ingatan?

Sebab saya tak berapa pasti, jadi saya ingin sesiapa yang lebih tahu menjawab, terima kasih!

某草草某草草2787 hari yang lalu742

membalas semua(3)saya akan balas

  • 漂亮男人

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

    Penimbal baharu mungkin bukan masalah letupan memori yang mudah. ​​Penampan diperuntukkan di luar timbunan V8, jadi ia sebenarnya lebih serius daripada masalah pertama yang saya ranap.

    Perkara kedua yang harus dikatakan ialah kerana saiz tatasusunan tidak akan berkembang, ia tidak akan memecahkan memori.

    Sebabnya disebut dalam artikel asal yang ketiga

    Sebagai contoh, dalam kes di atas, fungsi yang tidak digunakan memegang rujukan kepada originalThing, supaya objek lama tidak akan dilepaskan setiap kali, menyebabkan kebocoran memori

    Jika anda masih tidak faham, anda boleh membaca artikel penemu asal, yang menerangkannya secara terperinci.

    balas
    0
  • 黄舟

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

    Kod gelung tak terhingga akan memecahkan memori ke mana sahaja ia pergi, terutamanya bahasa berbenang tunggal​​seperti js, yang akan terus menyekat dan membeku.
    Saya tidak pernah menggunakan jenis Penampan Saya tidak pasti sama ada ia akan menyemak kumpulan memori, tetapi ia tidak masuk akal jika ia tersekat atau tidak.

    Saya bersetuju dengan penyataan terakhir anda Setiap kitaran mencipta objek baharu, dan alamat rujukan theThing sentiasa berubah Dalam keadaan biasa, objek rujukan lama harus dikumpul sampah, tetapi kerana rujukan yang tidak digunakan kepada objek originalThing, originalThing Another private. berubah-ubah, jadi objek lama tidak boleh dikumpul sampah, menyebabkan kebocoran memori.

    Adakah terdapat sebarang perbezaan antara kod berikut ini berjalan dalam persekitaran krom selama 30 saat.
    Gambar pertama ialah hasil tanpa kod ini, dan memori terapung pada 15M.
    Gambar kedua adalah hasil kod ini, ingatan terus berkembang.

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

    balas
    0
  • 高洛峰

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

    Saya tidak pasti, tetapi anda boleh menggunakan pakej memwatch-next untuk melihatnya

    balas
    0
  • Batalbalas